From e2508cf7ea2c777325f3da983eb1a379e0ef9f09 Mon Sep 17 00:00:00 2001 From: robertl Date: Wed, 19 Nov 2008 04:52:59 +0000 Subject: [PATCH] Rodney Lorrimar adds support for SBN as used by the Locosys GT-31/BGT-31. --- Makefile.in | 2 +- defs.h | 1 + navilink.c | 11 +- navilink.h | 5 + reference/track/sbn.SBN | Bin 0 -> 95024 bytes reference/track/sbn.gpx | 8220 +++++++++++++++++++++++++++++++++++++++ sbn.c | 331 ++ sbp.c | 97 +- testo | 8 +- util.c | 7 + vecs.c | 7 + xmldoc/formats/sbn.xml | 30 + 12 files changed, 8643 insertions(+), 76 deletions(-) create mode 100644 reference/track/sbn.SBN create mode 100644 reference/track/sbn.gpx create mode 100644 sbn.c create mode 100644 xmldoc/formats/sbn.xml diff --git a/Makefile.in b/Makefile.in index b20154649..5c2451327 100644 --- a/Makefile.in +++ b/Makefile.in @@ -61,7 +61,7 @@ ALL_FMTS=$(MINIMAL_FMTS) gtm.o gpsutil.o pcx.o cetus.o copilot.o \ ggv_log.o g7towin.o garmin_gpi.o lmx.o random.o xol.o dg-100.o \ navilink.o mtk_logger.o ik3d.o osm.o destinator.o exif.o vidaone.o \ igo8.o gopal.o humminbird.o mapasia.o gnav_trl.o navitel.o ggv_ovl.o \ - jtr.o sbp.o mmo.o skyforce.o itracku.o + jtr.o sbp.o sbn.o mmo.o skyforce.o itracku.o FMTS=@FMTS@ diff --git a/defs.h b/defs.h index e96eba6f8..984c7c6f4 100644 --- a/defs.h +++ b/defs.h @@ -909,6 +909,7 @@ typedef struct { */ signed int be_read16(const void *p); +unsigned int be_readu16(const void *p); signed int be_read32(const void *p); signed int le_read16(const void *p); unsigned int le_readu16(const void *p); diff --git a/navilink.c b/navilink.c index ecec3986a..9198c36fc 100644 --- a/navilink.c +++ b/navilink.c @@ -197,8 +197,8 @@ compare_waypoints(const waypoint *waypt1, const waypoint *waypt2) strcmp(waypt1->shortname, waypt2->shortname) == 0; } -static unsigned -checksum_packet(const unsigned char *packet, unsigned length) +unsigned +navilink_checksum_packet(const unsigned char *packet, unsigned length) { unsigned checksum = 0; @@ -237,7 +237,7 @@ write_packet(unsigned type, const void *payload, unsigned length) le_write16(packet + 2, length + 1); packet[4] = type; memcpy(packet + 5, payload, length); - le_write16(packet + length + 5, checksum_packet(packet + 4, length + 1)); + le_write16(packet + length + 5, navilink_checksum_packet(packet + 4, length + 1)); packet[length + 7] = 0xb0; packet[length + 8] = 0xb3; @@ -310,8 +310,9 @@ read_packet(unsigned type, void *payload, fatal(MYNAME ": Protocol error: Bad packet type (expected 0x%02x but got 0x%02x)\n", type, data[0]); } - if ((checksum = read_word()) != checksum_packet(data, size)) { - fatal(MYNAME ": Checksum error - expected %x got %x\n", checksum_packet(data, size), checksum); + if ((checksum = read_word()) != navilink_checksum_packet(data, size)) { + fatal(MYNAME ": Checksum error - expected %x got %x\n", + navilink_checksum_packet(data, size), checksum); } if (read_word() != 0xb3b0) { diff --git a/navilink.h b/navilink.h index a875eb8a0..d74eaaee4 100644 --- a/navilink.h +++ b/navilink.h @@ -28,7 +28,12 @@ #define SBP_RECORD_LEN 32 +/* defined in navilink.c */ waypoint *navilink_decode_logpoint(const unsigned char *buffer); +unsigned navilink_checksum_packet(const unsigned char *packet, unsigned length); + +/* defined in sbn.c */ +int locosys_decode_file_id(char *header, size_t len); #ifdef THIS_IS_ONLY_FOR_REFERENCE diff --git a/reference/track/sbn.SBN b/reference/track/sbn.SBN new file mode 100644 index 0000000000000000000000000000000000000000..f3d947a96fa511d431b1029650c8482f04fbd1a3 GIT binary patch literal 95024 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 literal 0 HcmV?d00001 diff --git a/reference/track/sbn.gpx b/reference/track/sbn.gpx new file mode 100644 index 000000000..9a9e0062e --- /dev/null +++ b/reference/track/sbn.gpx @@ -0,0 +1,8220 @@ + + + + + + + + 80.820000 + + 9.750000 + 1.220000 + 3d + 4 + 5.400000 + + + 80.320000 + + 359.589996 + 1.190000 + 3d + 4 + 5.400000 + + + 79.860000 + + 353.699982 + 0.950000 + 3d + 4 + 5.400000 + + + 79.420000 + + 15.790000 + 1.040000 + 3d + 4 + 5.400000 + + + 78.980000 + + 22.900000 + 0.920000 + 3d + 4 + 5.400000 + + + 78.530000 + + 25.400000 + 1.520000 + 3d + 4 + 5.400000 + + + 78.070000 + + 23.930000 + 1.760000 + 3d + 4 + 5.400000 + + + 77.610000 + + 39.189999 + 1.230000 + 3d + 4 + 5.400000 + + + 77.170000 + + 58.789997 + 1.130000 + 3d + 4 + 5.400000 + + + 76.460000 + + 66.559998 + 0.940000 + 3d + 4 + 5.400000 + + + 75.380000 + + 45.469997 + 1.320000 + 3d + 4 + 5.400000 + + + 74.310000 + + 39.719997 + 1.130000 + 3d + 4 + 5.400000 + + + 73.250000 + + 24.160000 + 1.470000 + 3d + 4 + 5.400000 + + + 72.090000 + + 22.160000 + 1.140000 + 3d + 4 + 5.400000 + + + 70.770000 + + 13.500000 + 1.130000 + 3d + 4 + 5.400000 + + + 69.450000 + + 16.520000 + 1.030000 + 3d + 4 + 5.400000 + + + 68.190000 + + 18.939999 + 1.230000 + 3d + 4 + 5.400000 + + + 66.980000 + + 23.480000 + 0.810000 + 3d + 4 + 5.400000 + + + 65.840000 + + 38.399998 + 1.020000 + 3d + 4 + 5.400000 + + + 64.770000 + + 22.549999 + 0.880000 + 3d + 4 + 5.400000 + + + 63.780000 + + 39.520000 + 0.830000 + 3d + 4 + 5.400000 + + + 62.860000 + + 47.939999 + 1.180000 + 3d + 4 + 5.400000 + + + 62.010000 + + 48.759998 + 1.070000 + 3d + 4 + 5.400000 + + + 61.230000 + + 56.529999 + 1.230000 + 3d + 4 + 5.400000 + + + 60.540000 + + 67.639999 + 1.110000 + 3d + 4 + 5.400000 + + + 59.910000 + + 73.400002 + 1.120000 + 3d + 4 + 5.400000 + + + 59.430000 + + 89.419998 + 1.360000 + 3d + 4 + 5.400000 + + + 59.090000 + + 106.129997 + 1.150000 + 3d + 4 + 5.400000 + + + 58.660000 + + 110.320000 + 0.990000 + 3d + 4 + 5.400000 + + + 58.320000 + + 153.649994 + 1.070000 + 3d + 4 + 5.400000 + + + 58.090000 + + 141.419998 + 1.200000 + 3d + 4 + 5.400000 + + + 57.780000 + + 146.440002 + 1.210000 + 3d + 4 + 5.400000 + + + 57.720000 + + 124.549995 + 0.810000 + 3d + 4 + 5.400000 + + + 57.770000 + + 215.580002 + 0.650000 + 3d + 4 + 5.400000 + + + 57.970000 + + 196.119995 + 1.450000 + 3d + 4 + 5.400000 + + + 58.430000 + + 196.509995 + 1.690000 + 3d + 4 + 5.400000 + + + 58.880000 + + 202.050003 + 1.980000 + 3d + 4 + 5.400000 + + + 59.440000 + + 207.690002 + 2.000000 + 3d + 4 + 5.400000 + + + 60.230000 + + 214.949997 + 0.920000 + 3d + 4 + 5.400000 + + + 61.070000 + + 280.729980 + 0.520000 + 3d + 4 + 5.400000 + + + 61.840000 + + 280.729980 + 0.530000 + none + 5.400000 + + + 62.550000 + + 280.729980 + 0.540000 + none + 5.400000 + + + 63.170000 + + 310.769989 + 0.480000 + 2d + 3 + 9.400001 + + + 63.710000 + + 277.269989 + 0.320000 + 2d + 3 + 9.400001 + + + 64.200000 + + 277.269989 + 0.310000 + none + 9.400001 + + + 64.630000 + + 277.709991 + 2.010000 + 3d + 4 + 5.400000 + + + 64.970000 + + 259.000000 + 1.070000 + 2d + 3 + 9.400001 + + + 65.240000 + + 8.490000 + 0.410000 + 2d + 3 + 9.400001 + + + 65.520000 + + 35.079998 + 1.950000 + 3d + 4 + 5.400000 + + + 65.890000 + + 31.939999 + 1.730000 + 2d + 3 + 9.200000 + + + 66.300000 + + 48.709999 + 1.200000 + 2d + 3 + 9.200000 + + + 66.700000 + + 54.520000 + 1.050000 + 2d + 3 + 9.200000 + + + 67.240000 + + 55.949997 + 1.090000 + 2d + 3 + 9.200000 + + + 67.830000 + + 47.529999 + 1.630000 + 2d + 3 + 9.200000 + + + 68.480000 + + 42.739998 + 1.540000 + 2d + 3 + 9.400001 + + + 69.070000 + + 42.739998 + 1.540000 + none + 9.400001 + + + 69.620000 + + 42.739998 + 1.530000 + none + 9.400001 + + + 70.290000 + + 39.700001 + 4.340000 + 2d + 3 + 5.800000 + + + 71.000000 + + 47.730000 + 3.380000 + 3d + 4 + 5.400000 + + + 71.710000 + + 47.149998 + 2.990000 + 3d + 4 + 5.400000 + + + 72.360000 + + 51.629997 + 1.690000 + 3d + 4 + 5.400000 + + + 72.840000 + + 179.149994 + 0.550000 + 3d + 4 + 5.400000 + + + 73.200000 + + 199.649994 + 0.620000 + 2d + 3 + 9.400001 + + + 73.370000 + + 227.599991 + 1.110000 + 3d + 4 + 5.400000 + + + 73.400000 + + 252.349991 + 0.770000 + 3d + 4 + 5.400000 + + + 73.430000 + + 238.239990 + 1.170000 + 3d + 4 + 5.400000 + + + 73.480000 + + 238.019989 + 1.830000 + 2d + 3 + 9.400001 + + + 73.560000 + + 237.049988 + 1.970000 + 2d + 3 + 5.800000 + + + 73.640000 + + 232.819992 + 2.190000 + 3d + 4 + 5.600000 + + + 73.580000 + + 224.879990 + 2.570000 + 3d + 4 + 5.600000 + + + 73.440000 + + 226.739990 + 2.760000 + 3d + 4 + 5.600000 + + + 73.340000 + + 223.349991 + 2.830000 + 2d + 3 + 9.400001 + + + 73.220000 + + 217.250000 + 3.270000 + 2d + 3 + 9.400001 + + + 73.050000 + + 221.039993 + 3.010000 + 2d + 3 + 9.400001 + + + 72.890000 + + 221.039993 + 2.990000 + none + 9.400001 + + + 72.740000 + + 221.039993 + 2.990000 + none + 9.400001 + + + 72.620000 + + 259.750000 + 3.140000 + 2d + 3 + 9.400001 + + + 72.480000 + + 237.259995 + 3.100000 + 2d + 3 + 9.400001 + + + 72.290000 + + 230.479996 + 4.820000 + 2d + 3 + 9.400001 + + + 72.090000 + + 229.899994 + 6.490000 + 2d + 3 + 9.400001 + + + 71.900000 + + 226.629990 + 7.570000 + 2d + 3 + 9.400001 + + + 71.720000 + + 226.629990 + 7.680000 + none + 9.400001 + + + 71.560000 + + 226.629990 + 7.690000 + none + 9.400001 + + + 71.560000 + + 0.000000 + 0.000000 + none + 9.400001 + + + 71.560000 + + 0.000000 + 0.000000 + none + 9.400001 + + + 70.530000 + + 219.360001 + 2.340000 + 2d + 3 + 5.800000 + + + 70.210000 + + 42.270000 + 0.490000 + 2d + 3 + 5.800000 + + + 69.870000 + + 31.689999 + 1.360000 + 2d + 3 + 5.800000 + + + 69.550000 + + 31.689999 + 1.450000 + none + 5.800000 + + + 69.250000 + + 31.689999 + 1.460000 + none + 5.800000 + + + 69.250000 + + 0.000000 + 0.000000 + none + 5.800000 + + + 69.250000 + + 0.000000 + 0.000000 + none + 5.800000 + + + 67.630000 + + 32.809998 + 2.840000 + 2d + 3 + 5.800000 + + + 67.370000 + + 37.380001 + 4.900000 + 2d + 3 + 5.800000 + + + 67.120000 + + 44.520000 + 3.260000 + 2d + 3 + 5.800000 + + + 66.890000 + + 42.139999 + 2.110000 + 2d + 3 + 5.800000 + + + 66.650000 + + 29.219999 + 1.590000 + 2d + 3 + 5.800000 + + + 66.430000 + + 29.219999 + 1.550000 + none + 5.800000 + + + 66.220000 + + 29.219999 + 1.540000 + none + 5.800000 + + + 65.850000 + + 54.500000 + 1.670000 + 3d + 4 + 5.600000 + + + 65.580000 + + 58.539997 + 0.980000 + 3d + 4 + 5.600000 + + + 65.410000 + + 61.910000 + 0.270000 + 3d + 4 + 5.600000 + + + 65.240000 + + 211.429993 + 1.710000 + 3d + 4 + 5.600000 + + + 65.300000 + + 215.750000 + 3.000000 + 3d + 4 + 5.600000 + + + 65.360000 + + 210.029999 + 3.570000 + 3d + 4 + 5.600000 + + + 65.160000 + + 203.949997 + 2.240000 + 3d + 4 + 5.600000 + + + 64.980000 + + 203.949997 + 2.110000 + none + 5.600000 + + + 64.800000 + + 203.949997 + 2.100000 + none + 5.600000 + + + 64.800000 + + 0.000000 + 0.000000 + none + 5.600000 + + + 64.200000 + + 208.720001 + 3.570000 + 3d + 4 + 5.600000 + + + 63.450000 + + 202.839996 + 3.340000 + 2d + 3 + 17.600000 + + + 62.860000 + + 198.750000 + 3.670000 + 2d + 3 + 9.600000 + + + 62.510000 + + 200.649994 + 5.640000 + 3d + 4 + 5.600000 + + + 62.300000 + + 208.459991 + 3.530000 + 2d + 3 + 9.400001 + + + 62.370000 + + 223.879990 + 1.940000 + 3d + 4 + 5.600000 + + + 62.340000 + + 201.979996 + 0.920000 + 3d + 4 + 5.600000 + + + 62.310000 + + 188.059998 + 1.030000 + 3d + 4 + 5.600000 + + + 62.190000 + + 186.179993 + 1.100000 + 2d + 3 + 9.400001 + + + 61.890000 + + 90.220001 + 0.560000 + 2d + 3 + 9.600000 + + + 61.520000 + + 76.849998 + 1.040000 + 2d + 3 + 9.600000 + + + 61.170000 + + 76.849998 + 1.100000 + none + 9.600000 + + + 60.850000 + + 76.849998 + 1.100000 + none + 9.600000 + + + 60.850000 + + 0.000000 + 0.000000 + none + 9.600000 + + + 60.850000 + + 0.000000 + 0.000000 + none + 9.600000 + + + 59.490000 + + 39.029999 + 3.050000 + 2d + 3 + 9.600000 + + + 58.920000 + + 33.009998 + 3.330000 + 2d + 3 + 9.600000 + + + 58.330000 + + 34.480000 + 3.120000 + 2d + 3 + 9.600000 + + + 57.580000 + + 14.420000 + 1.310000 + 3d + 4 + 5.600000 + + + 56.790000 + + 295.970001 + 0.460000 + 3d + 4 + 5.600000 + + + 56.130000 + + 215.610001 + 0.490000 + 3d + 4 + 5.600000 + + + 55.670000 + + 62.489998 + 0.130000 + 3d + 4 + 5.600000 + + + 55.180000 + + 41.950001 + 0.610000 + 2d + 3 + 5.800000 + + + 54.710000 + + 55.020000 + 1.230000 + 2d + 3 + 5.800000 + + + 54.200000 + + 120.949997 + 0.470000 + 3d + 4 + 5.600000 + + + 53.820000 + + 225.250000 + 0.290000 + 2d + 3 + 5.800000 + + + 53.450000 + + 239.259995 + 0.540000 + 3d + 4 + 5.600000 + + + 53.050000 + + 343.809998 + 0.590000 + 3d + 4 + 5.600000 + + + 52.830000 + + 12.820000 + 1.100000 + 3d + 4 + 5.600000 + + + 52.640000 + + 15.780000 + 1.170000 + 3d + 4 + 5.600000 + + + 52.470000 + + 9.010000 + 0.790000 + 3d + 4 + 5.600000 + + + 52.420000 + + 304.109985 + 0.330000 + 3d + 4 + 5.600000 + + + 52.410000 + + 220.009995 + 0.880000 + 2d + 3 + 5.800000 + + + 52.420000 + + 211.049988 + 1.150000 + 2d + 3 + 5.800000 + + + 52.420000 + + 81.589996 + 0.170000 + 2d + 3 + 5.800000 + + + 52.470000 + + 45.709999 + 0.980000 + 2d + 3 + 9.400001 + + + 52.550000 + + 46.919998 + 1.120000 + 3d + 4 + 5.600000 + + + 52.590000 + + 38.779999 + 1.090000 + 2d + 3 + 5.800000 + + + 52.620000 + + 28.250000 + 1.130000 + 2d + 3 + 5.800000 + + + 52.620000 + + 20.400000 + 1.940000 + 2d + 3 + 5.800000 + + + 52.610000 + + 20.400000 + 2.030000 + none + 5.800000 + + + 52.600000 + + 20.400000 + 2.040000 + none + 5.800000 + + + 52.650000 + + 53.809998 + 3.470000 + 2d + 3 + 6.000000 + + + 52.720000 + + 44.110001 + 3.420000 + 2d + 3 + 6.000000 + + + 52.810000 + + 35.899998 + 3.200000 + 2d + 3 + 9.800000 + + + 52.980000 + + 30.900000 + 3.050000 + 2d + 3 + 9.600000 + + + 53.090000 + + 29.709999 + 3.790000 + 3d + 4 + 5.600000 + + + 53.030000 + + 28.420000 + 3.290000 + 2d + 3 + 9.600000 + + + 52.770000 + + 28.559999 + 4.380000 + 3d + 4 + 5.600000 + + + 52.550000 + + 30.570000 + 3.880000 + 3d + 4 + 5.600000 + + + 52.280000 + + 32.860001 + 2.540000 + 3d + 4 + 5.600000 + + + 51.910000 + + 33.219997 + 2.400000 + 3d + 4 + 5.600000 + + + 51.600000 + + 26.900000 + 2.570000 + 3d + 4 + 5.600000 + + + 51.310000 + + 26.900000 + 2.580000 + none + 5.600000 + + + 51.250000 + + 58.789997 + 3.270000 + 3d + 4 + 5.600000 + + + 51.100000 + + 55.959999 + 3.360000 + 2d + 3 + 6.000000 + + + 50.950000 + + 55.959999 + 3.370000 + none + 6.000000 + + + 50.810000 + + 55.959999 + 3.370000 + none + 6.000000 + + + 50.810000 + + 0.000000 + 0.000000 + none + 6.000000 + + + 50.420000 + + 55.910000 + 0.750000 + 2d + 3 + 9.600000 + + + 49.610000 + + 28.340000 + 3.640000 + 3d + 4 + 5.600000 + + + 48.740000 + + 35.169998 + 1.780000 + 3d + 4 + 5.600000 + + + 48.110000 + + 217.799988 + 1.100000 + 3d + 4 + 5.600000 + + + 47.450000 + + 204.449997 + 3.150000 + 3d + 4 + 5.600000 + + + 46.840000 + + 205.539993 + 3.880000 + 3d + 4 + 5.600000 + + + 46.420000 + + 206.909988 + 4.300000 + 3d + 4 + 5.600000 + + + 45.960000 + + 203.339996 + 4.060000 + 2d + 3 + 9.600000 + + + 45.440000 + + 202.699997 + 4.000000 + 3d + 4 + 5.600000 + + + 44.910000 + + 193.769989 + 2.890000 + 3d + 4 + 5.600000 + + + 44.320000 + + 200.089996 + 2.670000 + 3d + 4 + 5.600000 + + + 43.660000 + + 206.440002 + 3.710000 + 3d + 4 + 5.600000 + + + 43.020000 + + 208.360001 + 3.500000 + 3d + 4 + 5.600000 + + + 42.300000 + + 207.929993 + 3.380000 + 3d + 4 + 5.600000 + + + 41.350000 + + 209.139999 + 3.980000 + 3d + 4 + 5.600000 + + + 40.350000 + + 208.750000 + 4.460000 + 3d + 4 + 5.600000 + + + 39.280000 + + 210.299988 + 4.230000 + 2d + 3 + 9.600000 + + + 38.290000 + + 209.220001 + 3.520000 + 2d + 3 + 9.600000 + + + 37.680000 + + 209.289993 + 2.760000 + 3d + 4 + 5.600000 + + + 37.190000 + + 207.519989 + 2.430000 + 2d + 3 + 9.600000 + + + 36.890000 + + 191.339996 + 1.520000 + 3d + 4 + 5.600000 + + + 36.670000 + + 167.979996 + 1.010000 + 2d + 3 + 10.000000 + + + 36.460000 + + 167.979996 + 0.970000 + none + 10.000000 + + + 36.190000 + + 119.559998 + 1.530000 + 3d + 4 + 5.600000 + + + 36.000000 + + 39.489998 + 1.530000 + 3d + 4 + 5.600000 + + + 35.780000 + + 14.809999 + 1.410000 + 3d + 4 + 5.600000 + + + 35.730000 + + 28.119999 + 2.930000 + 2d + 3 + 9.600000 + + + 35.810000 + + 23.869999 + 3.690000 + 2d + 3 + 9.600000 + + + 35.970000 + + 34.009998 + 3.340000 + 2d + 3 + 9.600000 + + + 35.960000 + + 48.980000 + 3.650000 + 3d + 4 + 5.800000 + + + 35.970000 + + 47.090000 + 4.330000 + 3d + 4 + 5.800000 + + + 35.950000 + + 49.469997 + 3.860000 + 3d + 4 + 5.800000 + + + 36.060000 + + 53.480000 + 3.570000 + 3d + 4 + 5.800000 + + + 36.270000 + + 50.549999 + 4.360000 + 2d + 3 + 17.400000 + + + 36.470000 + + 50.549999 + 4.440000 + none + 17.400000 + + + 36.780000 + + 37.529999 + 5.610000 + 2d + 3 + 9.600000 + + + 37.100000 + + 23.279999 + 6.000000 + 2d + 3 + 9.600000 + + + 37.470000 + + 23.059999 + 7.200000 + 2d + 3 + 9.600000 + + + 37.870000 + + 25.580000 + 8.410000 + 2d + 3 + 9.600000 + + + 38.240000 + + 27.109999 + 8.170000 + 2d + 3 + 9.600000 + + + 38.600000 + + 27.119999 + 7.190000 + 2d + 3 + 9.600000 + + + 38.940000 + + 28.699999 + 6.550000 + 2d + 3 + 9.600000 + + + 39.320000 + + 33.200001 + 5.460000 + 3d + 4 + 5.800000 + + + 39.670000 + + 33.200001 + 5.350000 + none + 5.800000 + + + 39.990000 + + 33.200001 + 5.340000 + none + 5.800000 + + + 39.990000 + + 0.000000 + 0.000000 + none + 5.800000 + + + 39.990000 + + 0.000000 + 0.000000 + none + 5.800000 + + + 43.710000 + + 29.730000 + 3.970000 + 2d + 3 + 9.600000 + + + 43.810000 + + 29.730000 + 3.830000 + none + 9.600000 + + + 43.750000 + + 22.869999 + 4.780000 + 2d + 3 + 9.600000 + + + 43.690000 + + 22.869999 + 4.880000 + none + 9.600000 + + + 43.640000 + + 22.869999 + 4.890000 + none + 9.600000 + + + 43.640000 + + 0.000000 + 0.000000 + none + 9.600000 + + + 43.640000 + + 0.000000 + 0.000000 + none + 9.600000 + + + 43.560000 + + 17.709999 + 3.230000 + 2d + 3 + 6.000000 + + + 43.510000 + + 21.020000 + 3.250000 + 3d + 4 + 5.800000 + + + 43.330000 + + 21.900000 + 2.570000 + 2d + 3 + 9.600000 + + + 43.160000 + + 21.900000 + 2.510000 + none + 9.600000 + + + 42.960000 + + 11.820000 + 2.020000 + 2d + 3 + 6.000000 + + + 42.780000 + + 311.419983 + 1.970000 + 2d + 3 + 6.000000 + + + 42.480000 + + 268.970001 + 2.260000 + 2d + 3 + 9.600000 + + + 42.310000 + + 241.169998 + 3.680000 + 2d + 3 + 6.000000 + + + 42.080000 + + 226.679993 + 5.290000 + 3d + 4 + 5.800000 + + + 41.900000 + + 221.659988 + 5.140000 + 2d + 3 + 6.000000 + + + 41.700000 + + 206.349991 + 6.070000 + 2d + 3 + 10.200000 + + + 41.520000 + + 206.349991 + 6.180000 + none + 10.200000 + + + 41.350000 + + 206.349991 + 6.190000 + none + 10.200000 + + + 41.350000 + + 0.000000 + 0.000000 + none + 10.200000 + + + 39.590000 + + 270.239990 + 5.450000 + 3d + 4 + 5.800000 + + + 39.870000 + + 308.910004 + 5.330000 + 3d + 4 + 5.800000 + + + 40.350000 + + 339.389984 + 7.790000 + 3d + 4 + 5.800000 + + + 40.630000 + + 347.539978 + 9.889999 + 3d + 4 + 5.800000 + + + 41.120000 + + 350.179993 + 9.580000 + 3d + 4 + 5.800000 + + + 41.770000 + + 351.539978 + 10.400000 + 3d + 4 + 5.800000 + + + 42.520000 + + 355.139984 + 10.870000 + 3d + 4 + 5.800000 + + + 43.340000 + + 357.019989 + 10.809999 + 3d + 4 + 5.800000 + + + 44.100000 + + 357.209991 + 10.889999 + 3d + 4 + 5.800000 + + + 45.090000 + + 0.740000 + 10.710000 + 3d + 4 + 5.800000 + + + 45.910000 + + 356.739990 + 9.590000 + 3d + 4 + 5.800000 + + + 46.850000 + + 356.829987 + 10.559999 + 3d + 4 + 5.800000 + + + 47.630000 + + 352.720001 + 10.950000 + 3d + 4 + 5.800000 + + + 47.840000 + + 350.859985 + 10.219999 + 3d + 4 + 5.800000 + + + 47.990000 + + 348.169983 + 10.410000 + 2d + 3 + 10.400001 + + + 47.920000 + + 347.500000 + 10.349999 + 2d + 3 + 10.400001 + + + 47.610000 + + 345.169983 + 10.130000 + 3d + 4 + 5.800000 + + + 47.440000 + + 342.699982 + 9.469999 + 2d + 3 + 10.400001 + + + 47.400000 + + 343.130005 + 9.969999 + 2d + 3 + 10.400001 + + + 47.080000 + + 345.869995 + 10.309999 + 3d + 4 + 5.800000 + + + 46.780000 + + 345.869995 + 10.349999 + none + 5.800000 + + + 46.510000 + + 345.869995 + 10.349999 + none + 5.800000 + + + 46.510000 + + 0.000000 + 0.000000 + none + 5.800000 + + + 46.510000 + + 0.000000 + 0.000000 + none + 5.800000 + + + 45.130000 + + 333.329987 + 9.000000 + 3d + 4 + 5.800000 + + + 44.410000 + + 337.329987 + 9.620000 + 3d + 4 + 5.800000 + + + 43.740000 + + 339.000000 + 10.700000 + 2d + 3 + 6.200000 + + + 43.060000 + + 342.579987 + 11.500000 + 2d + 3 + 6.200000 + + + 42.440000 + + 347.049988 + 13.980000 + 3d + 4 + 5.800000 + + + 42.010000 + + 348.359985 + 14.710000 + 3d + 4 + 5.800000 + + + 41.460000 + + 351.079987 + 15.589999 + 3d + 4 + 5.800000 + + + 41.060000 + + 350.399994 + 15.920000 + 3d + 4 + 5.800000 + + + 40.750000 + + 349.410004 + 15.860000 + 3d + 4 + 5.800000 + + + 40.370000 + + 348.000000 + 16.059999 + 3d + 4 + 5.800000 + + + 40.250000 + + 347.869995 + 16.100000 + 3d + 4 + 5.800000 + + + 40.190000 + + 345.989990 + 15.910000 + 3d + 4 + 5.800000 + + + 40.020000 + + 344.320007 + 15.759999 + 3d + 4 + 5.800000 + + + 39.890000 + + 343.059998 + 15.759999 + 3d + 4 + 5.800000 + + + 39.880000 + + 342.589996 + 16.180000 + 3d + 4 + 5.800000 + + + 39.790000 + + 342.589996 + 16.400000 + 3d + 4 + 5.800000 + + + 39.630000 + + 342.619995 + 16.789999 + 3d + 4 + 5.800000 + + + 39.490000 + + 342.809998 + 17.180000 + 3d + 4 + 5.800000 + + + 39.620000 + + 345.269989 + 17.740000 + 3d + 4 + 5.800000 + + + 39.810000 + + 345.459991 + 17.619999 + 3d + 4 + 5.800000 + + + 40.110000 + + 343.229980 + 16.940001 + 3d + 4 + 5.800000 + + + 40.520000 + + 341.419983 + 16.580000 + 3d + 4 + 5.800000 + + + 40.900000 + + 341.690002 + 16.699999 + 3d + 4 + 5.800000 + + + 41.520000 + + 340.509979 + 15.980000 + 3d + 4 + 5.800000 + + + 42.200000 + + 341.859985 + 16.160000 + 3d + 4 + 6.000000 + + + 43.020000 + + 343.049988 + 16.190001 + 3d + 4 + 6.000000 + + + 43.870000 + + 342.339996 + 16.139999 + 3d + 4 + 6.000000 + + + 44.790000 + + 344.350006 + 16.379999 + 3d + 4 + 6.000000 + + + 45.820000 + + 345.910004 + 16.609999 + 3d + 4 + 6.000000 + + + 46.890000 + + 346.399994 + 16.449999 + 3d + 4 + 6.000000 + + + 48.000000 + + 346.350006 + 16.330000 + 3d + 4 + 6.000000 + + + 49.190000 + + 346.459991 + 16.309999 + 3d + 4 + 6.000000 + + + 50.330000 + + 346.970001 + 16.279999 + 3d + 4 + 6.000000 + + + 51.100000 + + 347.959991 + 16.100000 + 2d + 3 + 17.000000 + + + 51.820000 + + 347.959991 + 16.090000 + none + 17.000000 + + + 52.490000 + + 347.959991 + 16.080000 + none + 17.000000 + + + 52.490000 + + 0.000000 + 0.000000 + none + 17.000000 + + + 98.980000 + + 330.440002 + 10.870000 + 3d + 4 + 6.400000 + + + 98.270000 + + 334.440002 + 10.900000 + 3d + 4 + 6.400000 + + + 97.230000 + + 334.279999 + 10.860000 + 3d + 4 + 6.400000 + + + 95.850000 + + 336.539978 + 10.750000 + 3d + 4 + 6.400000 + + + 94.670000 + + 331.309998 + 10.179999 + 3d + 4 + 6.400000 + + + 92.820000 + + 325.169983 + 9.530000 + 3d + 4 + 6.400000 + + + 90.980000 + + 324.609985 + 9.030000 + 2d + 3 + 12.200000 + + + 90.510000 + + 324.639984 + 8.700000 + 2d + 3 + 12.200000 + + + 91.280000 + + 319.789978 + 8.910000 + 3d + 4 + 6.400000 + + + 91.980000 + + 318.109985 + 9.240000 + 3d + 4 + 6.400000 + + + 92.850000 + + 320.019989 + 9.070000 + 3d + 4 + 6.400000 + + + 94.700000 + + 324.739990 + 9.250000 + 3d + 4 + 6.400000 + + + 96.410000 + + 324.630005 + 9.010000 + 3d + 4 + 6.400000 + + + 97.950000 + + 328.339996 + 8.480000 + 3d + 4 + 6.400000 + + + 99.090000 + + 320.619995 + 7.700000 + 3d + 4 + 6.400000 + + + 99.260000 + + 307.339996 + 6.710000 + 3d + 4 + 6.400000 + + + 98.910000 + + 312.699982 + 7.120000 + 3d + 4 + 6.400000 + + + 98.050000 + + 313.619995 + 8.000000 + 3d + 4 + 6.400000 + + + 96.960000 + + 313.970001 + 7.870000 + 3d + 4 + 6.400000 + + + 95.480000 + + 315.679993 + 7.380000 + 3d + 4 + 6.400000 + + + 93.400000 + + 321.919983 + 7.530000 + 3d + 4 + 6.400000 + + + 91.380000 + + 330.289978 + 8.179999 + 3d + 4 + 6.400000 + + + 89.810000 + + 336.339996 + 8.179999 + 3d + 4 + 6.400000 + + + 88.150000 + + 338.339996 + 7.800000 + 3d + 4 + 6.400000 + + + 86.460000 + + 340.720001 + 7.590000 + 2d + 3 + 16.600000 + + + 84.380000 + + 336.699982 + 7.470000 + 3d + 4 + 6.400000 + + + 82.100000 + + 337.190002 + 7.250000 + 3d + 4 + 6.400000 + + + 80.000000 + + 337.190002 + 7.230000 + none + 6.400000 + + + 78.050000 + + 337.190002 + 7.230000 + none + 6.400000 + + + 78.050000 + + 0.000000 + 0.000000 + none + 6.400000 + + + 78.050000 + + 0.000000 + 0.000000 + none + 6.400000 + + + 48.140000 + + 147.709991 + 1.280000 + 3d + 4 + 6.600000 + + + 50.280000 + + 132.199997 + 0.830000 + 3d + 4 + 6.600000 + + + 52.100000 + + 125.779999 + 0.370000 + 3d + 4 + 6.600000 + + + 54.120000 + + 98.430000 + 0.400000 + 3d + 4 + 6.600000 + + + 55.740000 + + 180.330002 + 0.690000 + 3d + 4 + 6.600000 + + + 57.670000 + + 59.399998 + 0.060000 + 3d + 4 + 6.600000 + + + 59.250000 + + 172.660004 + 0.810000 + 3d + 4 + 6.600000 + + + 60.490000 + + 102.519997 + 1.000000 + 3d + 4 + 6.600000 + + + 61.400000 + + 61.359997 + 1.450000 + 3d + 4 + 6.600000 + + + 62.120000 + + 50.939999 + 1.730000 + 3d + 4 + 6.600000 + + + 62.510000 + + 40.500000 + 2.310000 + 3d + 4 + 6.600000 + + + 62.750000 + + 41.040001 + 2.490000 + 3d + 4 + 6.600000 + + + 62.780000 + + 41.410000 + 2.500000 + 3d + 4 + 6.600000 + + + 62.650000 + + 34.399998 + 2.360000 + 3d + 4 + 6.600000 + + + 62.310000 + + 37.879997 + 2.000000 + 3d + 4 + 6.600000 + + + 61.610000 + + 52.860001 + 1.950000 + 3d + 4 + 6.600000 + + + 60.730000 + + 59.039997 + 1.490000 + 3d + 4 + 6.600000 + + + 59.460000 + + 61.070000 + 1.700000 + 3d + 4 + 6.600000 + + + 57.970000 + + 78.279999 + 1.330000 + 3d + 4 + 6.600000 + + + 56.350000 + + 119.820000 + 1.130000 + 3d + 4 + 6.600000 + + + 54.600000 + + 94.409996 + 1.140000 + 3d + 4 + 6.600000 + + + 52.570000 + + 113.879997 + 1.030000 + 3d + 4 + 6.600000 + + + 50.500000 + + 153.979996 + 1.230000 + 3d + 4 + 6.600000 + + + 48.460000 + + 152.860001 + 1.520000 + 3d + 4 + 6.600000 + + + 46.410000 + + 164.759995 + 1.330000 + 3d + 4 + 6.600000 + + + 44.510000 + + 145.339996 + 1.340000 + 3d + 4 + 6.600000 + + + 42.680000 + + 142.839996 + 1.110000 + 3d + 4 + 6.600000 + + + 40.910000 + + 158.789993 + 1.170000 + 3d + 4 + 6.600000 + + + 39.180000 + + 182.769989 + 1.890000 + 3d + 4 + 6.600000 + + + 37.520000 + + 168.550003 + 1.480000 + 3d + 4 + 6.600000 + + + 35.950000 + + 165.959991 + 1.260000 + 3d + 4 + 6.600000 + + + 34.450000 + + 168.800003 + 1.690000 + 3d + 4 + 6.600000 + + + 33.040000 + + 163.289993 + 1.720000 + 3d + 4 + 6.600000 + + + 31.720000 + + 135.119995 + 1.380000 + 3d + 4 + 6.600000 + + + 30.490000 + + 137.610001 + 1.180000 + 3d + 4 + 6.600000 + + + 29.340000 + + 172.029999 + 1.580000 + 3d + 4 + 6.600000 + + + 28.320000 + + 174.610001 + 1.560000 + 3d + 4 + 6.600000 + + + 27.380000 + + 154.699997 + 1.500000 + 3d + 4 + 6.600000 + + + 26.660000 + + 153.929993 + 1.470000 + 3d + 4 + 6.600000 + + + 26.000000 + + 161.489990 + 1.420000 + 3d + 4 + 6.600000 + + + 25.380000 + + 150.869995 + 1.190000 + 3d + 4 + 6.600000 + + + 24.810000 + + 89.680000 + 1.000000 + 3d + 4 + 6.600000 + + + 24.280000 + + 160.889999 + 1.280000 + 3d + 4 + 6.600000 + + + 23.800000 + + 146.199997 + 1.310000 + 3d + 4 + 6.600000 + + + 23.340000 + + 164.379990 + 1.550000 + 3d + 4 + 6.600000 + + + 22.940000 + + 150.489990 + 1.240000 + 3d + 4 + 6.600000 + + + 22.560000 + + 126.680000 + 1.080000 + 3d + 4 + 6.600000 + + + 22.210000 + + 134.190002 + 1.260000 + 3d + 4 + 6.600000 + + + 21.920000 + + 155.279999 + 1.110000 + 3d + 4 + 6.600000 + + + 21.700000 + + 158.330002 + 1.370000 + 3d + 4 + 6.600000 + + + 21.470000 + + 173.819992 + 1.900000 + 3d + 4 + 6.600000 + + + 21.280000 + + 140.410004 + 1.300000 + 3d + 4 + 6.600000 + + + 21.130000 + + 161.589996 + 1.510000 + 3d + 4 + 6.600000 + + + 20.970000 + + 171.649994 + 1.930000 + 3d + 4 + 6.600000 + + + 20.840000 + + 180.759995 + 1.860000 + 3d + 4 + 6.600000 + + + 20.720000 + + 151.929993 + 1.520000 + 3d + 4 + 6.600000 + + + 20.150000 + + 111.209999 + 1.090000 + 3d + 5 + 2.400000 + + + 19.610000 + + 80.639999 + 1.010000 + 3d + 5 + 2.400000 + + + 19.170000 + + 78.519997 + 1.320000 + 3d + 5 + 2.400000 + + + 18.790000 + + 94.619995 + 0.760000 + 3d + 5 + 2.400000 + + + 18.540000 + + 87.619995 + 1.480000 + 3d + 5 + 2.400000 + + + 18.270000 + + 112.059998 + 1.440000 + 3d + 5 + 2.400000 + + + 18.180000 + + 131.520004 + 1.480000 + 3d + 5 + 2.400000 + + + 18.190000 + + 139.479996 + 1.340000 + 3d + 5 + 2.400000 + + + 18.320000 + + 142.399994 + 1.530000 + 3d + 5 + 2.400000 + + + 18.530000 + + 139.500000 + 1.550000 + 3d + 5 + 2.400000 + + + 19.040000 + + 134.399994 + 1.320000 + 3d + 5 + 2.400000 + + + 19.650000 + + 142.970001 + 1.300000 + 3d + 5 + 2.400000 + + + 20.420000 + + 136.550003 + 1.250000 + 3d + 5 + 2.400000 + + + 21.300000 + + 156.639999 + 1.530000 + 3d + 5 + 2.400000 + + + 22.160000 + + 156.229996 + 0.820000 + 3d + 5 + 2.400000 + + + 22.980000 + + 146.379990 + 1.450000 + 3d + 5 + 2.400000 + + + 23.760000 + + 135.239990 + 1.290000 + 3d + 5 + 2.400000 + + + 24.490000 + + 137.759995 + 1.020000 + 3d + 5 + 2.400000 + + + 25.030000 + + 157.389999 + 1.440000 + 3d + 5 + 2.400000 + + + 25.590000 + + 135.619995 + 1.150000 + 3d + 5 + 2.400000 + + + 26.050000 + + 109.329994 + 0.980000 + 3d + 5 + 2.400000 + + + 26.610000 + + 129.559998 + 1.070000 + 3d + 4 + 2.400000 + + + 27.090000 + + 141.349991 + 1.670000 + 3d + 5 + 2.400000 + + + 27.370000 + + 140.330002 + 1.720000 + 3d + 5 + 2.400000 + + + 27.280000 + + 210.479996 + 1.410000 + 3d + 5 + 2.400000 + + + 26.980000 + + 161.000000 + 1.560000 + 3d + 5 + 2.400000 + + + 26.310000 + + 123.849998 + 1.760000 + 3d + 5 + 2.400000 + + + 25.550000 + + 133.979996 + 1.580000 + 3d + 5 + 2.400000 + + + 24.790000 + + 145.029999 + 1.530000 + 3d + 5 + 2.400000 + + + 23.890000 + + 121.269997 + 1.410000 + 3d + 5 + 2.400000 + + + 22.860000 + + 141.619995 + 1.650000 + 3d + 5 + 2.400000 + + + 21.720000 + + 126.909996 + 1.480000 + 3d + 5 + 2.400000 + + + 20.530000 + + 136.119995 + 1.500000 + 3d + 5 + 2.400000 + + + 19.280000 + + 127.000000 + 1.530000 + 3d + 5 + 2.400000 + + + 18.090000 + + 131.319992 + 1.550000 + 3d + 5 + 2.400000 + + + 16.970000 + + 113.389999 + 1.370000 + 3d + 5 + 2.400000 + + + 16.240000 + + 127.509995 + 0.920000 + 3d + 6 + 1.800000 + + + 15.500000 + + 112.959999 + 0.930000 + 3d + 6 + 1.800000 + + + 14.770000 + + 99.930000 + 1.190000 + 3d + 6 + 1.800000 + + + 14.090000 + + 92.529999 + 1.120000 + 3d + 6 + 1.800000 + + + 13.440000 + + 125.049995 + 1.410000 + 3d + 6 + 1.800000 + + + 12.870000 + + 112.559998 + 1.590000 + 3d + 6 + 1.800000 + + + 12.390000 + + 95.549995 + 1.680000 + 3d + 6 + 1.800000 + + + 12.000000 + + 80.259995 + 1.420000 + 3d + 6 + 1.800000 + + + 11.710000 + + 74.510002 + 1.500000 + 3d + 6 + 1.800000 + + + 11.510000 + + 70.610001 + 1.540000 + 3d + 5 + 2.200000 + + + 11.360000 + + 73.879997 + 0.810000 + 3d + 6 + 1.800000 + + + 11.240000 + + 68.629997 + 1.000000 + 3d + 6 + 1.800000 + + + 11.110000 + + 71.519997 + 1.500000 + 3d + 6 + 1.800000 + + + 10.950000 + + 65.699997 + 1.200000 + 3d + 6 + 1.800000 + + + 10.760000 + + 63.180000 + 1.600000 + 3d + 6 + 1.800000 + + + 10.620000 + + 44.869999 + 1.170000 + 3d + 6 + 1.800000 + + + 10.730000 + + 67.820000 + 0.590000 + 3d + 6 + 1.800000 + + + 10.890000 + + 82.779999 + 1.050000 + 3d + 6 + 1.800000 + + + 11.060000 + + 70.080002 + 1.050000 + 3d + 6 + 1.800000 + + + 11.190000 + + 88.900002 + 1.480000 + 3d + 6 + 1.800000 + + + 11.310000 + + 73.540001 + 1.440000 + 3d + 6 + 1.800000 + + + 11.440000 + + 76.879997 + 1.690000 + 3d + 6 + 1.800000 + + + 11.980000 + + 95.500000 + 1.450000 + 3d + 6 + 1.800000 + + + 12.550000 + + 103.169998 + 1.400000 + 3d + 5 + 1.800000 + + + 13.520000 + + 97.049995 + 1.720000 + 3d + 6 + 1.800000 + + + 14.920000 + + 110.269997 + 1.690000 + 3d + 6 + 1.800000 + + + 16.380000 + + 107.579994 + 1.560000 + 3d + 6 + 1.800000 + + + 17.830000 + + 110.250000 + 1.360000 + 3d + 6 + 1.800000 + + + 19.300000 + + 117.959999 + 1.910000 + 3d + 6 + 1.800000 + + + 20.700000 + + 111.820000 + 1.700000 + 3d + 6 + 1.800000 + + + 22.070000 + + 106.139999 + 1.750000 + 3d + 6 + 1.800000 + + + 23.390000 + + 95.759995 + 1.720000 + 3d + 6 + 1.800000 + + + 24.370000 + + 96.769997 + 1.650000 + 3d + 6 + 1.800000 + + + 25.140000 + + 73.709999 + 1.180000 + 3d + 6 + 1.800000 + + + 25.620000 + + 70.400002 + 1.360000 + 3d + 6 + 1.800000 + + + 25.840000 + + 76.259995 + 1.390000 + 3d + 6 + 1.800000 + + + 25.860000 + + 78.909996 + 1.160000 + 3d + 6 + 1.800000 + + + 25.590000 + + 70.769997 + 1.100000 + 3d + 6 + 1.800000 + + + 25.040000 + + 77.369995 + 0.940000 + 3d + 6 + 1.800000 + + + 24.480000 + + 77.150002 + 0.840000 + 3d + 6 + 1.800000 + + + 23.910000 + + 72.449997 + 0.920000 + 3d + 6 + 1.800000 + + + 23.240000 + + 66.720001 + 1.010000 + 3d + 6 + 1.800000 + + + 22.520000 + + 60.309998 + 1.050000 + 3d + 6 + 1.800000 + + + 21.740000 + + 53.969997 + 1.310000 + 3d + 6 + 1.800000 + + + 20.890000 + + 69.799995 + 1.740000 + 3d + 6 + 1.800000 + + + 20.020000 + + 83.189995 + 1.300000 + 3d + 6 + 1.800000 + + + 19.220000 + + 74.339996 + 1.250000 + 3d + 6 + 1.800000 + + + 18.490000 + + 76.330002 + 1.270000 + 3d + 5 + 1.800000 + + + 17.790000 + + 83.659996 + 1.390000 + 3d + 6 + 1.800000 + + + 17.180000 + + 73.309998 + 2.020000 + 3d + 6 + 1.800000 + + + 16.580000 + + 87.139999 + 1.120000 + 3d + 6 + 1.800000 + + + 16.000000 + + 83.849998 + 1.090000 + 3d + 6 + 1.800000 + + + 15.480000 + + 83.400002 + 0.980000 + 3d + 6 + 1.800000 + + + 14.960000 + + 80.739998 + 1.140000 + 3d + 6 + 1.800000 + + + 14.510000 + + 75.669998 + 1.190000 + 3d + 6 + 1.800000 + + + 14.020000 + + 76.099998 + 1.170000 + 3d + 6 + 1.800000 + + + 13.590000 + + 65.709999 + 1.320000 + 3d + 6 + 1.800000 + + + 13.210000 + + 79.669998 + 0.940000 + 3d + 6 + 1.800000 + + + 12.800000 + + 90.579994 + 0.780000 + 3d + 6 + 1.800000 + + + 12.440000 + + 60.259998 + 0.970000 + 3d + 6 + 1.800000 + + + 12.100000 + + 71.689995 + 0.950000 + 3d + 7 + 1.400000 + + + 11.740000 + + 35.910000 + 0.690000 + 3d + 7 + 1.400000 + + + 11.450000 + + 85.509995 + 0.600000 + 3d + 7 + 1.400000 + + + 11.180000 + + 62.469997 + 0.820000 + 3d + 7 + 1.400000 + + + 10.880000 + + 67.779999 + 0.550000 + 3d + 7 + 1.400000 + + + 10.690000 + + 81.209999 + 0.440000 + 3d + 7 + 1.400000 + + + 10.590000 + + 86.919998 + 0.740000 + 3d + 7 + 1.400000 + + + 10.520000 + + 98.549995 + 0.700000 + 3d + 7 + 1.400000 + + + 10.450000 + + 105.680000 + 0.790000 + 3d + 7 + 1.400000 + + + 10.330000 + + 102.629997 + 0.780000 + 3d + 7 + 1.400000 + + + 10.230000 + + 86.619995 + 1.060000 + 3d + 7 + 1.400000 + + + 10.150000 + + 83.099998 + 1.010000 + 3d + 7 + 1.400000 + + + 10.100000 + + 106.829994 + 1.040000 + 3d + 7 + 1.400000 + + + 9.980000 + + 110.430000 + 0.990000 + 3d + 7 + 1.400000 + + + 9.790000 + + 115.869995 + 1.090000 + 3d + 7 + 1.400000 + + + 9.630000 + + 106.449997 + 1.000000 + 3d + 7 + 1.400000 + + + 9.530000 + + 114.199997 + 1.130000 + 3d + 7 + 1.400000 + + + 9.470000 + + 123.019997 + 1.160000 + 3d + 7 + 1.400000 + + + 9.380000 + + 115.079994 + 1.280000 + 3d + 7 + 1.400000 + + + 9.270000 + + 117.209999 + 1.170000 + 3d + 7 + 1.400000 + + + 9.150000 + + 112.470001 + 1.170000 + 3d + 7 + 1.400000 + + + 9.080000 + + 111.509995 + 1.230000 + 3d + 7 + 1.400000 + + + 9.020000 + + 108.299995 + 1.110000 + 3d + 7 + 1.400000 + + + 8.970000 + + 112.349998 + 1.100000 + 3d + 7 + 1.400000 + + + 8.880000 + + 106.199997 + 1.140000 + 3d + 7 + 1.400000 + + + 8.810000 + + 99.839996 + 1.080000 + 3d + 7 + 1.400000 + + + 8.750000 + + 112.279999 + 1.210000 + 3d + 7 + 1.400000 + + + 8.740000 + + 116.149994 + 1.230000 + 3d + 7 + 1.400000 + + + 8.680000 + + 111.849998 + 1.310000 + 3d + 7 + 1.400000 + + + 8.580000 + + 115.750000 + 1.050000 + 3d + 7 + 1.400000 + + + 8.450000 + + 109.579994 + 1.270000 + 3d + 7 + 1.400000 + + + 8.260000 + + 110.439995 + 1.510000 + 3d + 7 + 1.400000 + + + 8.040000 + + 121.409996 + 1.450000 + 3d + 7 + 1.400000 + + + 7.820000 + + 129.419998 + 1.260000 + 3d + 7 + 1.400000 + + + 7.600000 + + 122.430000 + 1.310000 + 3d + 7 + 1.400000 + + + 7.370000 + + 132.220001 + 1.300000 + 3d + 7 + 1.400000 + + + 7.290000 + + 143.690002 + 1.100000 + 3d + 7 + 1.400000 + + + 7.190000 + + 124.619995 + 1.240000 + 3d + 7 + 1.400000 + + + 7.050000 + + 135.379990 + 1.340000 + 3d + 7 + 1.400000 + + + 6.930000 + + 129.349991 + 1.230000 + 3d + 7 + 1.400000 + + + 6.770000 + + 105.409996 + 1.180000 + 3d + 7 + 1.400000 + + + 6.580000 + + 106.729996 + 0.550000 + 3d + 7 + 1.400000 + + + 6.350000 + + 150.449997 + 0.750000 + 3d + 7 + 1.400000 + + + 6.120000 + + 116.099998 + 1.060000 + 3d + 7 + 1.400000 + + + 6.030000 + + 113.839996 + 1.260000 + 3d + 7 + 1.400000 + + + 6.030000 + + 131.259995 + 1.080000 + 3d + 7 + 1.400000 + + + 5.940000 + + 137.929993 + 1.160000 + 3d + 7 + 1.400000 + + + 5.860000 + + 138.580002 + 1.000000 + 3d + 7 + 1.400000 + + + 5.800000 + + 125.669998 + 1.210000 + 3d + 7 + 1.400000 + + + 5.740000 + + 128.639999 + 1.180000 + 3d + 7 + 1.400000 + + + 5.630000 + + 121.860001 + 1.140000 + 3d + 7 + 1.400000 + + + 5.580000 + + 123.349998 + 1.000000 + 3d + 7 + 1.400000 + + + 5.560000 + + 122.829994 + 1.150000 + 3d + 7 + 1.400000 + + + 5.590000 + + 122.070000 + 1.270000 + 3d + 7 + 1.400000 + + + 5.560000 + + 119.939995 + 1.170000 + 3d + 7 + 1.400000 + + + 5.550000 + + 113.269997 + 1.230000 + 3d + 5 + 2.600000 + + + 5.450000 + + 125.629997 + 1.270000 + 3d + 7 + 1.400000 + + + 5.260000 + + 137.029999 + 1.070000 + 3d + 7 + 1.400000 + + + 5.070000 + + 100.129997 + 1.650000 + 3d + 7 + 1.400000 + + + 4.840000 + + 142.419998 + 1.070000 + 3d + 7 + 1.400000 + + + 4.680000 + + 123.079994 + 1.170000 + 3d + 7 + 1.400000 + + + 4.500000 + + 125.479996 + 0.990000 + 3d + 7 + 1.400000 + + + 4.510000 + + 103.720001 + 1.160000 + 3d + 7 + 1.400000 + + + 4.440000 + + 136.470001 + 1.190000 + 3d + 7 + 1.400000 + + + 4.350000 + + 131.649994 + 1.120000 + 3d + 7 + 1.400000 + + + 4.390000 + + 125.290001 + 1.250000 + 3d + 7 + 1.400000 + + + 4.420000 + + 141.770004 + 1.210000 + 3d + 7 + 1.400000 + + + 4.430000 + + 153.550003 + 1.130000 + 3d + 7 + 1.400000 + + + 4.590000 + + 135.819992 + 1.280000 + 3d + 7 + 1.400000 + + + 4.910000 + + 168.449997 + 1.090000 + 3d + 7 + 1.400000 + + + 5.220000 + + 172.459991 + 1.190000 + 3d + 7 + 1.400000 + + + 5.530000 + + 185.179993 + 1.260000 + 3d + 7 + 1.400000 + + + 5.930000 + + 190.849991 + 1.430000 + 3d + 7 + 1.400000 + + + 6.280000 + + 185.429993 + 1.520000 + 3d + 7 + 1.400000 + + + 6.630000 + + 189.729996 + 1.730000 + 3d + 7 + 1.400000 + + + 6.950000 + + 190.119995 + 1.550000 + 3d + 7 + 1.400000 + + + 7.360000 + + 186.610001 + 1.800000 + 3d + 6 + 1.400000 + + + 7.780000 + + 182.330002 + 1.560000 + 3d + 6 + 1.400000 + + + 8.340000 + + 185.589996 + 1.630000 + 3d + 7 + 1.400000 + + + 8.750000 + + 187.449997 + 1.500000 + 3d + 7 + 1.400000 + + + 9.100000 + + 166.239990 + 1.330000 + 3d + 7 + 1.400000 + + + 9.440000 + + 149.750000 + 1.010000 + 3d + 7 + 1.400000 + + + 9.780000 + + 142.319992 + 1.220000 + 3d + 7 + 1.400000 + + + 10.200000 + + 125.659996 + 1.120000 + 3d + 7 + 1.400000 + + + 10.520000 + + 131.169998 + 1.310000 + 3d + 6 + 1.800000 + + + 10.810000 + + 125.909996 + 0.880000 + 3d + 6 + 1.800000 + + + 10.970000 + + 122.139999 + 0.780000 + 3d + 6 + 1.800000 + + + 11.140000 + + 120.290001 + 0.850000 + 3d + 5 + 1.800000 + + + 11.230000 + + 142.209991 + 0.800000 + 3d + 6 + 1.800000 + + + 11.200000 + + 137.410004 + 1.050000 + 3d + 6 + 1.800000 + + + 11.080000 + + 120.860001 + 1.110000 + 3d + 5 + 2.600000 + + + 10.830000 + + 120.219994 + 1.640000 + 3d + 6 + 1.800000 + + + 10.490000 + + 130.529999 + 1.340000 + 3d + 6 + 1.800000 + + + 10.250000 + + 106.389999 + 1.250000 + 3d + 6 + 1.800000 + + + 10.050000 + + 122.989998 + 1.070000 + 3d + 6 + 1.800000 + + + 9.890000 + + 126.339996 + 1.470000 + 3d + 6 + 1.800000 + + + 9.810000 + + 107.669998 + 1.240000 + 3d + 6 + 1.800000 + + + 9.850000 + + 118.909996 + 1.300000 + 3d + 6 + 1.800000 + + + 9.880000 + + 103.029999 + 1.140000 + 3d + 6 + 1.800000 + + + 9.780000 + + 101.430000 + 1.260000 + 3d + 6 + 1.800000 + + + 9.680000 + + 94.939995 + 1.280000 + 3d + 6 + 1.800000 + + + 9.540000 + + 98.680000 + 1.320000 + 3d + 6 + 1.800000 + + + 9.330000 + + 101.739998 + 1.190000 + 3d + 6 + 1.800000 + + + 8.970000 + + 99.139999 + 1.170000 + 3d + 6 + 1.800000 + + + 8.690000 + + 88.839996 + 1.380000 + 3d + 7 + 1.400000 + + + 8.420000 + + 109.339996 + 1.300000 + 3d + 7 + 1.400000 + + + 8.190000 + + 111.269997 + 1.490000 + 3d + 7 + 1.400000 + + + 7.940000 + + 110.320000 + 1.060000 + 3d + 7 + 1.400000 + + + 7.680000 + + 98.279999 + 1.070000 + 3d + 7 + 1.400000 + + + 7.550000 + + 121.729996 + 0.770000 + 3d + 7 + 1.400000 + + + 7.550000 + + 98.379997 + 1.010000 + 3d + 7 + 1.400000 + + + 7.670000 + + 112.409996 + 1.220000 + 3d + 7 + 1.400000 + + + 7.800000 + + 124.639999 + 1.000000 + 3d + 7 + 1.400000 + + + 8.040000 + + 111.290001 + 1.260000 + 3d + 7 + 1.400000 + + + 8.280000 + + 121.059998 + 0.950000 + 3d + 7 + 1.400000 + + + 8.590000 + + 107.919998 + 1.460000 + 3d + 7 + 1.400000 + + + 9.010000 + + 119.790001 + 1.380000 + 3d + 7 + 1.400000 + + + 9.520000 + + 117.979996 + 1.290000 + 3d + 7 + 1.400000 + + + 9.870000 + + 109.649994 + 1.250000 + 3d + 7 + 1.400000 + + + 10.140000 + + 122.019997 + 1.210000 + 3d + 7 + 1.400000 + + + 10.370000 + + 131.239990 + 1.310000 + 3d + 7 + 1.400000 + + + 10.690000 + + 146.500000 + 1.320000 + 3d + 7 + 1.400000 + + + 11.040000 + + 125.919998 + 1.380000 + 3d + 6 + 1.600000 + + + 11.310000 + + 96.439995 + 1.440000 + 3d + 7 + 1.400000 + + + 11.640000 + + 117.279999 + 1.050000 + 3d + 7 + 1.400000 + + + 11.870000 + + 120.959999 + 1.050000 + 3d + 7 + 1.400000 + + + 12.090000 + + 95.259995 + 1.130000 + 3d + 7 + 1.400000 + + + 12.380000 + + 109.159996 + 1.150000 + 3d + 7 + 1.400000 + + + 12.570000 + + 91.610001 + 1.380000 + 3d + 7 + 1.400000 + + + 12.770000 + + 101.259995 + 1.300000 + 3d + 7 + 1.400000 + + + 13.080000 + + 106.070000 + 1.050000 + 3d + 7 + 1.400000 + + + 13.410000 + + 102.759995 + 1.150000 + 3d + 7 + 1.400000 + + + 13.750000 + + 108.709999 + 0.860000 + 3d + 7 + 1.400000 + + + 14.110000 + + 108.680000 + 1.380000 + 3d + 7 + 1.400000 + + + 14.420000 + + 111.299995 + 1.250000 + 3d + 7 + 1.400000 + + + 14.620000 + + 107.930000 + 1.080000 + 3d + 7 + 1.400000 + + + 14.850000 + + 108.610001 + 1.250000 + 3d + 7 + 1.400000 + + + 14.990000 + + 109.889999 + 1.260000 + 3d + 6 + 1.400000 + + + 15.180000 + + 91.739998 + 1.270000 + 3d + 7 + 1.400000 + + + 15.380000 + + 99.769997 + 1.190000 + 3d + 7 + 1.400000 + + + 15.570000 + + 95.900002 + 1.060000 + 3d + 7 + 1.400000 + + + 15.790000 + + 108.339996 + 1.070000 + 3d + 7 + 1.400000 + + + 16.030000 + + 100.949997 + 1.030000 + 3d + 7 + 1.400000 + + + 16.310000 + + 103.139999 + 0.710000 + 3d + 6 + 3.200000 + + + 16.500000 + + 100.839996 + 0.620000 + 3d + 6 + 3.200000 + + + 16.490000 + + 113.349998 + 0.610000 + 3d + 6 + 3.200000 + + + 16.480000 + + 104.829994 + 0.390000 + 3d + 7 + 1.400000 + + + 16.420000 + + 326.160004 + 0.630000 + 3d + 7 + 1.400000 + + + 16.350000 + + 326.169983 + 0.600000 + 3d + 7 + 1.400000 + + + 16.320000 + + 328.130005 + 0.470000 + 3d + 6 + 1.800000 + + + 16.370000 + + 43.869999 + 0.120000 + 3d + 7 + 1.400000 + + + 16.460000 + + 161.110001 + 0.000000 + 3d + 7 + 1.400000 + + + 16.740000 + + 155.360001 + 0.230000 + 3d + 7 + 1.400000 + + + 16.990000 + + 120.529999 + 0.180000 + 3d + 7 + 1.400000 + + + 17.310000 + + 136.239990 + 0.240000 + 3d + 7 + 1.400000 + + + 17.680000 + + 159.860001 + 0.300000 + 3d + 7 + 1.400000 + + + 17.940000 + + 163.220001 + 0.230000 + 3d + 8 + 1.200000 + + + 18.120000 + + 149.959991 + 0.150000 + 3d + 8 + 1.200000 + + + 18.220000 + + 137.080002 + 0.120000 + 3d + 8 + 1.200000 + + + 18.400000 + + 151.789993 + 0.250000 + 3d + 7 + 1.200000 + + + 18.520000 + + 158.470001 + 0.290000 + 3d + 7 + 1.200000 + + + 18.590000 + + 123.309998 + 0.150000 + 3d + 8 + 1.200000 + + + 18.620000 + + 76.889999 + 0.180000 + 3d + 8 + 1.200000 + + + 18.670000 + + 110.409996 + 0.710000 + 3d + 8 + 1.200000 + + + 18.580000 + + 104.250000 + 0.990000 + 3d + 8 + 1.200000 + + + 18.410000 + + 91.269997 + 0.900000 + 3d + 8 + 1.200000 + + + 18.220000 + + 67.000000 + 1.010000 + 3d + 7 + 1.600000 + + + 18.030000 + + 76.430000 + 1.150000 + 3d + 7 + 1.600000 + + + 17.810000 + + 53.320000 + 1.050000 + 3d + 7 + 1.600000 + + + 17.460000 + + 27.750000 + 1.550000 + 3d + 7 + 1.600000 + + + 17.000000 + + 25.920000 + 1.110000 + 3d + 6 + 2.800000 + + + 16.390000 + + 51.459999 + 0.900000 + 3d + 8 + 1.200000 + + + 15.780000 + + 80.739998 + 1.240000 + 3d + 8 + 1.200000 + + + 15.200000 + + 69.070000 + 1.420000 + 3d + 8 + 1.200000 + + + 14.680000 + + 89.769997 + 1.220000 + 3d + 8 + 1.200000 + + + 14.260000 + + 82.729996 + 1.340000 + 3d + 7 + 1.400000 + + + 13.750000 + + 117.029999 + 1.580000 + 3d + 8 + 1.200000 + + + 13.300000 + + 91.110001 + 1.200000 + 3d + 8 + 1.200000 + + + 12.880000 + + 96.139999 + 1.180000 + 3d + 8 + 1.200000 + + + 12.480000 + + 83.119995 + 1.070000 + 3d + 7 + 1.600000 + + + 12.050000 + + 114.769997 + 1.340000 + 3d + 7 + 1.600000 + + + 11.670000 + + 123.469994 + 1.880000 + 3d + 7 + 1.600000 + + + 11.310000 + + 110.989998 + 1.460000 + 3d + 8 + 1.200000 + + + 10.840000 + + 114.379997 + 1.710000 + 3d + 8 + 1.200000 + + + 10.330000 + + 104.389999 + 1.620000 + 3d + 8 + 1.200000 + + + 9.870000 + + 98.059998 + 1.360000 + 3d + 8 + 1.200000 + + + 9.450000 + + 109.430000 + 1.060000 + 3d + 8 + 1.200000 + + + 9.190000 + + 95.879997 + 1.140000 + 3d + 8 + 1.200000 + + + 9.090000 + + 87.019997 + 1.110000 + 3d + 8 + 1.200000 + + + 8.880000 + + 81.479996 + 1.010000 + 3d + 8 + 1.200000 + + + 8.700000 + + 87.900002 + 0.850000 + 3d + 8 + 1.200000 + + + 8.540000 + + 85.739998 + 0.910000 + 3d + 8 + 1.200000 + + + 8.430000 + + 58.419998 + 0.870000 + 3d + 7 + 1.600000 + + + 8.190000 + + 26.889999 + 0.800000 + 3d + 7 + 1.600000 + + + 7.790000 + + 9.010000 + 0.870000 + 3d + 8 + 1.200000 + + + 7.430000 + + 41.689999 + 1.080000 + 3d + 8 + 1.200000 + + + 6.970000 + + 50.000000 + 0.790000 + 3d + 8 + 1.200000 + + + 6.530000 + + 102.959999 + 0.430000 + 3d + 8 + 1.200000 + + + 6.090000 + + 132.300003 + 0.680000 + 3d + 8 + 1.200000 + + + 5.790000 + + 144.319992 + 0.850000 + 3d + 8 + 1.200000 + + + 5.470000 + + 171.289993 + 1.190000 + 3d + 8 + 1.200000 + + + 5.220000 + + 189.379990 + 1.210000 + 3d + 8 + 1.200000 + + + 5.020000 + + 203.860001 + 1.380000 + 3d + 8 + 1.200000 + + + 4.890000 + + 208.519989 + 1.460000 + 3d + 8 + 1.200000 + + + 4.770000 + + 217.289993 + 1.130000 + 3d + 8 + 1.200000 + + + 4.640000 + + 220.330002 + 0.900000 + 3d + 8 + 1.200000 + + + 4.590000 + + 238.179993 + 1.130000 + 3d + 8 + 1.200000 + + + 4.600000 + + 237.759995 + 1.070000 + 3d + 8 + 1.200000 + + + 4.620000 + + 229.500000 + 1.030000 + 3d + 7 + 1.600000 + + + 4.710000 + + 234.769989 + 0.900000 + 3d + 7 + 1.600000 + + + 4.900000 + + 210.769989 + 0.930000 + 3d + 8 + 1.200000 + + + 5.120000 + + 202.779999 + 0.930000 + 3d + 7 + 1.400000 + + + 5.380000 + + 204.339996 + 1.220000 + 3d + 7 + 1.400000 + + + 5.670000 + + 204.649994 + 0.800000 + 3d + 8 + 1.200000 + + + 6.040000 + + 202.899994 + 0.920000 + 3d + 7 + 1.400000 + + + 6.550000 + + 185.489990 + 0.700000 + 3d + 7 + 1.400000 + + + 7.140000 + + 201.110001 + 0.610000 + 3d + 8 + 1.200000 + + + 7.540000 + + 183.699997 + 0.940000 + 3d + 8 + 1.200000 + + + 7.880000 + + 170.139999 + 0.900000 + 3d + 8 + 1.200000 + + + 8.110000 + + 165.369995 + 0.910000 + 3d + 8 + 1.200000 + + + 8.210000 + + 148.589996 + 0.770000 + 3d + 8 + 1.200000 + + + 8.340000 + + 142.679993 + 0.680000 + 3d + 8 + 1.200000 + + + 8.440000 + + 142.929993 + 0.620000 + 3d + 8 + 1.200000 + + + 8.490000 + + 135.830002 + 0.550000 + 3d + 8 + 1.200000 + + + 8.570000 + + 260.169983 + 0.140000 + 3d + 8 + 1.200000 + + + 8.660000 + + 187.039993 + 0.140000 + 3d + 8 + 1.200000 + + + 8.780000 + + 26.500000 + 0.200000 + 3d + 7 + 1.400000 + + + 8.870000 + + 34.599998 + 0.050000 + 3d + 8 + 1.200000 + + + 8.900000 + + 350.570007 + 0.020000 + 3d + 8 + 1.200000 + + + 8.890000 + + 260.759979 + 0.050000 + 3d + 7 + 1.800000 + + + 8.880000 + + 219.440002 + 0.220000 + 3d + 8 + 1.200000 + + + 8.870000 + + 226.459991 + 0.110000 + 3d + 7 + 1.800000 + + + 8.840000 + + 39.419998 + 0.200000 + 3d + 8 + 1.200000 + + + 8.890000 + + 175.860001 + 0.110000 + 3d + 8 + 1.200000 + + + 8.920000 + + 133.139999 + 0.190000 + 3d + 8 + 1.200000 + + + 8.920000 + + 330.169983 + 0.030000 + 3d + 8 + 1.200000 + + + 8.910000 + + 327.179993 + 0.100000 + 3d + 8 + 1.200000 + + + 8.940000 + + 74.269997 + 0.060000 + 3d + 8 + 1.200000 + + + 8.920000 + + 109.089996 + 0.040000 + 3d + 8 + 1.200000 + + + 8.930000 + + 336.559998 + 0.140000 + 3d + 8 + 1.200000 + + + 8.860000 + + 61.949997 + 0.190000 + 3d + 8 + 1.200000 + + + 8.760000 + + 61.759998 + 0.260000 + 3d + 8 + 1.200000 + + + 8.670000 + + 92.419998 + 0.430000 + 3d + 8 + 1.200000 + + + 8.610000 + + 66.750000 + 0.200000 + 3d + 8 + 1.200000 + + + 8.560000 + + 324.449982 + 0.090000 + 3d + 8 + 1.200000 + + + 8.420000 + + 357.380005 + 0.200000 + 3d + 8 + 1.200000 + + + 8.190000 + + 351.019989 + 0.130000 + 3d + 8 + 1.200000 + + + 7.920000 + + 19.209999 + 0.040000 + 3d + 8 + 1.200000 + + + 7.590000 + + 145.009995 + 0.000000 + 3d + 8 + 1.200000 + + + 7.250000 + + 26.900000 + 0.070000 + 3d + 8 + 1.200000 + + + 6.950000 + + 351.289978 + 0.370000 + 3d + 8 + 1.200000 + + + 6.500000 + + 14.740000 + 0.520000 + 3d + 8 + 1.200000 + + + 6.070000 + + 23.070000 + 1.040000 + 3d + 8 + 1.200000 + + + 5.600000 + + 30.049999 + 0.720000 + 3d + 8 + 1.200000 + + + 5.180000 + + 41.360001 + 0.870000 + 3d + 8 + 1.200000 + + + 4.720000 + + 51.129997 + 0.630000 + 3d + 7 + 1.400000 + + + 4.190000 + + 43.689999 + 0.580000 + 3d + 6 + 1.800000 + + + 3.700000 + + 55.699997 + 0.660000 + 3d + 7 + 1.400000 + + + 3.330000 + + 24.199999 + 0.380000 + 3d + 7 + 1.400000 + + + 3.080000 + + 25.129999 + 1.050000 + 3d + 7 + 1.400000 + + + 2.790000 + + 25.779999 + 1.190000 + 3d + 7 + 1.400000 + + + 2.610000 + + 39.489998 + 0.700000 + 3d + 7 + 1.400000 + + + 2.690000 + + 54.660000 + 0.370000 + 3d + 7 + 1.400000 + + + 2.580000 + + 5.130000 + 0.320000 + 3d + 7 + 1.400000 + + + 2.440000 + + 64.869995 + 0.190000 + 3d + 7 + 1.400000 + + + 2.200000 + + 34.880001 + 0.550000 + 3d + 7 + 1.400000 + + + 1.940000 + + 30.330000 + 0.770000 + 3d + 7 + 1.400000 + + + 1.770000 + + 19.410000 + 0.470000 + 3d + 7 + 1.400000 + + + 1.510000 + + 5.770000 + 0.230000 + 3d + 7 + 1.400000 + + + 1.320000 + + 18.840000 + 0.360000 + 3d + 7 + 1.400000 + + + 1.070000 + + 44.579998 + 0.270000 + 3d + 7 + 1.400000 + + + 0.950000 + + 94.409996 + 0.250000 + 3d + 7 + 1.400000 + + + 0.980000 + + 255.229996 + 0.040000 + 3d + 7 + 1.400000 + + + 1.220000 + + 95.209999 + 0.030000 + 3d + 7 + 1.400000 + + + 1.610000 + + 57.459999 + 0.080000 + 3d + 7 + 1.400000 + + + 2.150000 + + 50.500000 + 0.060000 + 3d + 7 + 1.400000 + + + 2.780000 + + 8.290000 + 0.040000 + 3d + 7 + 1.400000 + + + 3.480000 + + 8.190000 + 0.070000 + 3d + 7 + 1.400000 + + + 4.250000 + + 4.430000 + 0.070000 + 3d + 7 + 1.400000 + + + 5.070000 + + 352.539978 + 0.020000 + 3d + 7 + 1.400000 + + + 5.940000 + + 346.149994 + 0.010000 + 3d + 7 + 1.400000 + + + 6.850000 + + 3.570000 + 0.020000 + 3d + 7 + 1.400000 + + + 7.720000 + + 34.110001 + 0.070000 + 3d + 7 + 1.400000 + + + 8.550000 + + 39.809998 + 0.080000 + 3d + 7 + 1.400000 + + + 9.310000 + + 28.139999 + 0.080000 + 3d + 7 + 1.400000 + + + 10.060000 + + 93.349998 + 0.040000 + 3d + 7 + 1.400000 + + + 10.790000 + + 107.689995 + 0.080000 + 3d + 7 + 1.400000 + + + 11.530000 + + 151.300003 + 0.030000 + 3d + 7 + 1.400000 + + + 12.130000 + + 84.549995 + 0.060000 + 3d + 7 + 1.400000 + + + 12.640000 + + 33.899998 + 0.050000 + 3d + 7 + 1.400000 + + + 13.060000 + + 58.399998 + 0.040000 + 3d + 7 + 1.400000 + + + 13.350000 + + 130.679993 + 0.050000 + 3d + 7 + 1.400000 + + + 13.590000 + + 22.889999 + 0.090000 + 3d + 7 + 1.400000 + + + 13.750000 + + 106.019997 + 0.030000 + 3d + 7 + 1.400000 + + + 13.790000 + + 136.729996 + 0.080000 + 3d + 7 + 1.400000 + + + 13.810000 + + 39.680000 + 0.020000 + 3d + 7 + 1.400000 + + + 13.880000 + + 5.770000 + 0.110000 + 3d + 7 + 1.400000 + + + 13.910000 + + 16.959999 + 0.070000 + 3d + 7 + 1.400000 + + + 13.880000 + + 207.549988 + 0.060000 + 3d + 7 + 1.400000 + + + 13.790000 + + 48.869999 + 0.030000 + 3d + 7 + 1.400000 + + + 13.660000 + + 56.449997 + 0.080000 + 3d + 8 + 1.000000 + + + 13.480000 + + 49.020000 + 0.050000 + 3d + 8 + 1.000000 + + + 13.310000 + + 95.939995 + 0.010000 + 3d + 8 + 1.000000 + + + 13.130000 + + 299.250000 + 0.010000 + 3d + 7 + 1.000000 + + + 12.950000 + + 232.959991 + 0.020000 + 3d + 8 + 1.000000 + + + 12.820000 + + 245.159988 + 0.040000 + 3d + 8 + 1.000000 + + + 12.700000 + + 353.070007 + 0.110000 + 3d + 8 + 1.000000 + + + 12.520000 + + 31.289999 + 0.070000 + 3d + 8 + 1.000000 + + + 12.340000 + + 118.379997 + 0.040000 + 3d + 8 + 1.000000 + + + 12.130000 + + 53.849998 + 0.080000 + 3d + 8 + 1.000000 + + + 11.900000 + + 86.720001 + 0.110000 + 3d + 8 + 1.000000 + + + 11.640000 + + 60.320000 + 0.100000 + 3d + 8 + 1.000000 + + + 11.370000 + + 82.589996 + 0.080000 + 3d + 8 + 1.000000 + + + 11.090000 + + 258.489990 + 0.000000 + 3d + 8 + 1.000000 + + + 10.840000 + + 256.880005 + 0.090000 + 3d + 8 + 1.000000 + + + 10.550000 + + 98.169998 + 0.050000 + 3d + 8 + 1.000000 + + + 10.180000 + + 83.619995 + 0.160000 + 3d + 8 + 1.000000 + + + 9.830000 + + 214.099991 + 0.110000 + 3d + 8 + 1.000000 + + + 9.470000 + + 227.099991 + 0.230000 + 3d + 8 + 1.000000 + + + 9.230000 + + 84.639999 + 0.060000 + 3d + 8 + 1.000000 + + + 9.120000 + + 346.459991 + 0.130000 + 3d + 7 + 1.000000 + + + 9.140000 + + 28.969999 + 0.390000 + 3d + 7 + 1.000000 + + + 9.100000 + + 14.679999 + 0.640000 + 3d + 8 + 1.000000 + + + 8.970000 + + 20.600000 + 0.830000 + 3d + 8 + 1.000000 + + + 8.810000 + + 8.860000 + 1.020000 + 3d + 8 + 1.000000 + + + 8.590000 + + 36.200001 + 1.010000 + 3d + 8 + 1.000000 + + + 8.260000 + + 42.509998 + 0.880000 + 3d + 8 + 1.000000 + + + 7.970000 + + 56.439999 + 0.850000 + 3d + 8 + 1.000000 + + + 7.760000 + + 58.959999 + 0.870000 + 3d + 8 + 1.000000 + + + 7.510000 + + 54.869999 + 0.910000 + 3d + 7 + 1.400000 + + + 7.090000 + + 55.899998 + 0.540000 + 3d + 8 + 1.000000 + + + 6.690000 + + 23.500000 + 0.840000 + 3d + 8 + 1.000000 + + + 6.320000 + + 31.160000 + 0.900000 + 3d + 8 + 1.000000 + + + 5.910000 + + 37.309998 + 0.870000 + 3d + 8 + 1.000000 + + + 5.360000 + + 170.569992 + 1.130000 + 3d + 8 + 1.000000 + + + 4.870000 + + 103.949997 + 0.420000 + 3d + 8 + 1.000000 + + + 4.440000 + + 172.899994 + 0.360000 + 3d + 7 + 1.000000 + + + 4.130000 + + 202.779999 + 0.420000 + 3d + 7 + 1.000000 + + + 3.840000 + + 221.129990 + 0.540000 + 3d + 8 + 1.000000 + + + 3.650000 + + 201.479996 + 0.580000 + 3d + 8 + 1.000000 + + + 3.430000 + + 226.049988 + 0.210000 + 3d + 8 + 1.000000 + + + 3.180000 + + 235.409988 + 0.540000 + 3d + 8 + 1.000000 + + + 3.000000 + + 223.929993 + 0.500000 + 3d + 8 + 1.000000 + + + 2.840000 + + 234.659988 + 0.250000 + 3d + 8 + 1.000000 + + + 2.710000 + + 301.799988 + 0.120000 + 3d + 8 + 1.000000 + + + 2.580000 + + 54.199997 + 0.150000 + 3d + 7 + 2.000000 + + + 2.560000 + + 339.829987 + 0.120000 + 3d + 8 + 1.000000 + + + 2.500000 + + 266.820007 + 0.020000 + 3d + 7 + 1.400000 + + + 2.500000 + + 140.250000 + 0.120000 + 3d + 8 + 1.000000 + + + 2.480000 + + 65.209999 + 0.050000 + 3d + 7 + 1.400000 + + + 2.450000 + + 331.989990 + 0.130000 + 3d + 7 + 1.400000 + + + 2.400000 + + 6.470000 + 0.140000 + 3d + 8 + 1.000000 + + + 2.430000 + + 6.480000 + 0.200000 + 3d + 7 + 1.400000 + + + 2.490000 + + 237.119995 + 0.050000 + 3d + 7 + 1.400000 + + + 2.540000 + + 190.319992 + 0.300000 + 3d + 8 + 1.000000 + + + 2.550000 + + 89.680000 + 0.100000 + 3d + 8 + 1.000000 + + + 2.460000 + + 227.529999 + 0.100000 + 3d + 8 + 1.000000 + + + 2.400000 + + 211.129990 + 0.740000 + 3d + 8 + 1.000000 + + + 2.390000 + + 212.099991 + 0.590000 + 3d + 8 + 1.000000 + + + 2.330000 + + 313.160004 + 0.130000 + 3d + 8 + 1.000000 + + + 2.290000 + + 355.209991 + 0.060000 + 3d + 8 + 1.000000 + + + 2.350000 + + 130.259995 + 0.090000 + 3d + 8 + 1.000000 + + + 2.390000 + + 11.880000 + 0.050000 + 3d + 8 + 1.000000 + + + 2.420000 + + 25.209999 + 0.050000 + 3d + 8 + 1.000000 + + + 2.440000 + + 49.709999 + 0.040000 + 3d + 8 + 1.000000 + + + 2.460000 + + 33.250000 + 0.040000 + 3d + 8 + 1.000000 + + + 2.480000 + + 43.570000 + 0.040000 + 3d + 8 + 1.000000 + + + 2.490000 + + 39.389999 + 0.050000 + 3d + 8 + 1.000000 + + + 2.480000 + + 52.329998 + 0.040000 + 3d + 8 + 1.000000 + + + 2.410000 + + 57.430000 + 0.400000 + 3d + 8 + 1.000000 + + + 2.280000 + + 44.649998 + 0.300000 + 3d + 8 + 1.000000 + + + 2.100000 + + 354.149994 + 0.720000 + 3d + 8 + 1.000000 + + + 1.920000 + + 17.139999 + 0.510000 + 3d + 8 + 1.000000 + + + 1.760000 + + 30.510000 + 0.540000 + 3d + 8 + 1.000000 + + + 1.570000 + + 23.160000 + 0.670000 + 3d + 7 + 1.000000 + + + 1.460000 + + 39.110001 + 0.540000 + 3d + 8 + 1.000000 + + + 1.390000 + + 27.500000 + 0.590000 + 3d + 8 + 1.000000 + + + 1.330000 + + 40.619999 + 0.450000 + 3d + 8 + 1.000000 + + + 1.280000 + + 51.110001 + 0.530000 + 3d + 8 + 1.000000 + + + 1.170000 + + 21.139999 + 0.530000 + 3d + 8 + 1.000000 + + + 1.160000 + + 17.260000 + 0.360000 + 3d + 8 + 1.000000 + + + 1.030000 + + 39.160000 + 0.310000 + 3d + 8 + 1.000000 + + + 0.760000 + + 15.410000 + 0.190000 + 3d + 8 + 1.000000 + + + 0.500000 + + 68.299995 + 0.070000 + 3d + 8 + 1.000000 + + + 0.260000 + + 48.139999 + 0.140000 + 3d + 8 + 1.000000 + + + 0.050000 + + 256.529999 + 0.320000 + 3d + 8 + 1.000000 + + + -0.050000 + + 325.419983 + 0.320000 + 3d + 8 + 1.000000 + + + -0.070000 + + 334.079987 + 0.050000 + 3d + 8 + 1.000000 + + + -0.030000 + + 68.290001 + 0.200000 + 3d + 8 + 1.000000 + + + 0.010000 + + 351.459991 + 0.060000 + 3d + 8 + 1.000000 + + + 0.080000 + + 332.729980 + 0.070000 + 3d + 7 + 1.400000 + + + 0.150000 + + 69.909996 + 0.100000 + 3d + 8 + 1.000000 + + + 0.240000 + + 44.700001 + 0.190000 + 3d + 8 + 1.000000 + + + 0.270000 + + 162.459991 + 0.030000 + 3d + 8 + 1.000000 + + + 0.300000 + + 75.720001 + 0.040000 + 3d + 8 + 1.000000 + + + 0.340000 + + 114.739998 + 0.030000 + 3d + 8 + 1.000000 + + + 0.380000 + + 65.559998 + 0.100000 + 3d + 8 + 1.000000 + + + 0.460000 + + 69.419998 + 0.120000 + 3d + 8 + 1.000000 + + + 0.510000 + + 322.649994 + 0.070000 + 3d + 8 + 1.000000 + + + 0.580000 + + 27.279999 + 0.040000 + 3d + 8 + 1.000000 + + + 0.680000 + + 36.000000 + 0.050000 + 3d + 8 + 1.000000 + + + 0.800000 + + 43.709999 + 0.030000 + 3d + 8 + 1.000000 + + + 0.930000 + + 45.700001 + 0.070000 + 3d + 8 + 1.000000 + + + 1.090000 + + 52.230000 + 0.070000 + 3d + 8 + 1.000000 + + + 1.280000 + + 45.329998 + 0.110000 + 3d + 8 + 1.000000 + + + 1.490000 + + 47.119999 + 0.100000 + 3d + 7 + 2.000000 + + + 1.680000 + + 56.139999 + 0.070000 + 3d + 8 + 1.000000 + + + 1.760000 + + 58.689999 + 0.100000 + 3d + 8 + 1.000000 + + + 1.840000 + + 138.759995 + 0.130000 + 3d + 8 + 1.000000 + + + 1.870000 + + 308.339996 + 0.100000 + 3d + 8 + 1.000000 + + + 1.910000 + + 55.250000 + 0.190000 + 3d + 8 + 1.000000 + + + 2.030000 + + 322.799988 + 0.350000 + 3d + 7 + 1.400000 + + + 2.220000 + + 343.479980 + 0.670000 + 3d + 8 + 1.000000 + + + 2.360000 + + 40.820000 + 0.470000 + 3d + 8 + 1.000000 + + + 2.450000 + + 41.110001 + 0.350000 + 3d + 8 + 1.000000 + + + 2.500000 + + 340.970001 + 0.430000 + 3d + 8 + 1.000000 + + + 2.620000 + + 301.220001 + 0.590000 + 3d + 8 + 1.000000 + + + 2.660000 + + 256.019989 + 0.640000 + 3d + 8 + 1.000000 + + + 2.700000 + + 246.779999 + 0.450000 + 3d + 8 + 1.000000 + + + 2.780000 + + 231.279999 + 0.410000 + 3d + 8 + 1.000000 + + + 2.830000 + + 286.880005 + 0.080000 + 3d + 8 + 1.000000 + + + 2.840000 + + 232.349991 + 0.120000 + 3d + 8 + 1.000000 + + + 2.820000 + + 26.379999 + 0.160000 + 3d + 8 + 1.000000 + + + 2.760000 + + 359.239990 + 0.160000 + 3d + 7 + 1.400000 + + + 2.660000 + + 27.830000 + 0.150000 + 3d + 8 + 1.000000 + + + 2.580000 + + 133.819992 + 0.060000 + 3d + 8 + 1.000000 + + + 2.570000 + + 28.250000 + 0.150000 + 3d + 7 + 1.400000 + + + 2.540000 + + 301.220001 + 0.050000 + 3d + 7 + 1.400000 + + + 2.550000 + + 72.150002 + 0.030000 + 3d + 7 + 1.400000 + + + 2.550000 + + 48.230000 + 0.050000 + 3d + 7 + 1.400000 + + + 2.560000 + + 85.879997 + 0.180000 + 3d + 8 + 1.000000 + + + 2.620000 + + 46.719997 + 0.270000 + 3d + 8 + 1.000000 + + + 2.690000 + + 30.209999 + 0.170000 + 3d + 8 + 1.000000 + + + 2.740000 + + 159.919998 + 0.010000 + 3d + 7 + 1.400000 + + + 2.790000 + + 41.649998 + 0.050000 + 3d + 7 + 1.400000 + + + 2.840000 + + 33.110001 + 0.130000 + 3d + 8 + 1.000000 + + + 2.940000 + + 14.190000 + 0.090000 + 3d + 7 + 1.400000 + + + 3.050000 + + 28.490000 + 0.310000 + 3d + 7 + 1.400000 + + + + diff --git a/sbn.c b/sbn.c new file mode 100644 index 000000000..bf94ecc23 --- /dev/null +++ b/sbn.c @@ -0,0 +1,331 @@ +/* + Locosys NaviGPS GT-31/BGT-31 SiRF binary logging format (SBN) + + Copyright (C) 2008 Rodney Lorrimar + Copyright (C) 2005 Robert Lipe, robertlipe@usa.net + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + */ + +#include "defs.h" +#include "navilink.h" +#include + +#define MYNAME "sbn" + +static gbfile *file_handle = NULL; + +static +arglist_t sbn_args[] = { + ARG_TERMINATOR +}; + + +/**********************************************************************/ + +/* Packets are encoded according to the SiRF Binary Protocol. + * + * http://www.navmanwirelessoem.com/oem/customer-support/oem-ne + * ws/product-briefs-and-data-sheets/jupiter-32-xlp-new2/sirf-b + * inary-protocol-reference-manual + * + * The important packet is "Geodetic Navigation Data" (Message ID 41). + */ + +#define PID_SBN 41 +#define SBN_RECORD_LEN 95 /* 91 plus two shorts added by Locosys */ +#define PID_VISIBLE_LIST 13 +#define PID_QRY_INFORMATION 253 +#define QRY_INFORMATION_LEN 41 +#define INFO_USERNAME_LEN 13 +#define INFO_SERIAL_NUM_LEN 9 +#define INFO_LOG_RATE_LEN 3 +#define INFO_VERSION_LEN 12 +#define INFO_SEP ',' + + +/* + * Very similar to read_packet in navilink.c, except reads from file + * instead of serial, and integers are read in big endian order. + */ +static size_t +read_packet(int *type, void *payload, size_t max_len) +{ + size_t size, data_size; + unsigned char start[4]; + unsigned int checksum_exp, checksum_act; + unsigned char *data; + + if (gbfread(start, sizeof(start), 1, file_handle) != 1) { + if (gbfeof(file_handle)) + return 0; + + fatal(MYNAME ": Format error: No packet start.\n"); + } + + if (start[0] != 0xa0 || start[1] != 0xa2) { + fatal(MYNAME ": Format error: Bad packet start.\n"); + } + + size = be_readu16(start + 2); + + if (size < 1 || max_len < size) { + fatal(MYNAME ": Format error: unexpected size: %d.\n", (int) size); + } + + /* allocate space for checksum and trailing 0xb0b3 */ + data_size = size + 4; + + /* data_size can be up to about 64k */ + data = xmalloc(data_size); + + if (gbfread(data, data_size, 1, file_handle) != 1) { + fatal(MYNAME ": Format error: could not read %d bytes.\n", + (int) data_size); + } + + *type = data[0]; + + checksum_exp = be_readu16(data + size); + checksum_act = navilink_checksum_packet(data, size); + + if (checksum_exp != checksum_act) { + fatal(MYNAME ": Checksum error - expected %x got %x\n", + checksum_exp, checksum_act); + } + + if (data[size + 2] != 0xb0 || data[size + 3] != 0xb3) { + fatal(MYNAME ": Format error: Bad packet trailer\n"); + } + + --size; + + memcpy(payload, data + 1, size); + xfree(data); + + return size; +} + +#ifdef LOCOSYS_PARSE_FILE_ID +static size_t +hdrcpy(char *dest, const char *src, size_t max_len) +{ + size_t i; + + for (i = 0; i < max_len && *src != INFO_SEP; i++) + *dest++ = *src++; + *dest++ = 0; + + return ++i; +} +#endif /* LOCOSYS_PARSE_FILE_ID */ + +int +locosys_decode_file_id(char *header, size_t len) +{ +#ifdef LOCOSYS_PARSE_FILE_ID + /* + * MID_FILE_ID(0xfd) contains the following payload : + * User Name, Serial Number, Log Rate, Firmware Version + * >field separator:"," + * >User Name : MAX CHAR(13) + * >Serial Number : MAX CHAR(8) + * >Log Rate : MAX CHAR 3, 0..255 in seconds + * >Firmware Version : MAX CHAR (13) + */ + + char username[INFO_USERNAME_LEN + 1]; + char serial_num[INFO_SERIAL_NUM_LEN + 1]; + char log_rate[INFO_LOG_RATE_LEN + 1]; + char version[INFO_VERSION_LEN + 1]; + char *p = header; + + p += hdrcpy(username, p, INFO_USERNAME_LEN); + p += hdrcpy(serial_num, p, INFO_SERIAL_NUM_LEN); + p += hdrcpy(log_rate, p, INFO_LOG_RATE_LEN); + p += hdrcpy(version, p, INFO_VERSION_LEN); + + printf(MYNAME ": Username: %s\n", username); + printf(MYNAME ": Serial Number: %s\n", serial_num); + printf(MYNAME ": Log rate (seconds): %s\n", log_rate); + printf(MYNAME ": Firmware version: %s\n", version); +#endif /* LOCOSYS_PARSE_FILE_ID */ + + return TRUE; +} + +static void +read_sbn_header(route_head *track) +{ + char header[QRY_INFORMATION_LEN]; + size_t len; + int type = 0; + + len = read_packet(&type, header, sizeof(header)); + + if (len == 0 || type != PID_QRY_INFORMATION || + !locosys_decode_file_id(header, len)) { + fatal(MYNAME ": Format error: Couldn't read SBN header." + "This probably isn't a SBN file.\n"); + } +} + +static int +is_sbn_valid(const unsigned char *buffer) +{ + /* valid navigation (any bit set implies navigation solution is not + * optimal) */ + return !buffer[0] && !buffer[1]; +} + +static fix_type +decode_sbn_mode(const unsigned char *mode) +{ + static const fix_type fixes[8] = { + fix_none, /* 000 No Nav */ + fix_none, /* 001 1 SV solution */ + fix_none, /* 010 2 SV solution */ + fix_2d, /* 011 3 SV solution (2D) */ + fix_3d, /* 100 4 or more SV solution (3D) */ + fix_2d, /* 101 Least Square 2D solution */ + fix_3d, /* 110 Least Square 3D solution */ + fix_none /* 111 DR solution (no SV) */ + }; + int dgps_correction = *mode & 0x80; + fix_type fix = fixes[*mode & 7]; + + return dgps_correction && fix == fix_3d ? fix_dgps : fix; +} + +static void +decode_sbn_datetime(const unsigned char *buffer, waypoint *waypt) +{ + struct tm tm; + int ms = be_readu16(buffer + 6); + + tm.tm_sec = ms / 1000; + tm.tm_min = buffer[5]; + tm.tm_hour = buffer[4]; + tm.tm_mday = buffer[3]; + tm.tm_mon = buffer[2] - 1; + tm.tm_year = be_readu16(buffer) - 1900; + + waypt->creation_time = mkgmtime(&tm); + waypt->microseconds = (ms % 1000) * 1000; +} + +static void +decode_sbn_position(const unsigned char *buffer, waypoint *waypt) +{ + waypt->latitude = be_read32(buffer + 0) * 0.0000001; + waypt->longitude = be_read32(buffer + 4) * 0.0000001; + waypt->altitude = be_read32(buffer + 12) * 0.01; +} + +static waypoint * +decode_sbn_record(unsigned char *buffer) +{ + waypoint *waypt = NULL; + waypt = waypt_new(); + + if (is_sbn_valid(buffer)) + waypt->fix = decode_sbn_mode(buffer + 3); + else + waypt->fix = fix_none; + + decode_sbn_datetime(buffer + 10, waypt); + decode_sbn_position(buffer + 22, waypt); + WAYPT_SET(waypt, speed, be_read16(buffer + 39) * 0.01f); + WAYPT_SET(waypt, course, be_read16(buffer + 41) * 0.01f); + waypt->sat = buffer[87]; + waypt->hdop = buffer[88] * 0.2f; + + return waypt; +} + +static void +add_logpoints(route_head *track) +{ + unsigned char buffer[SBN_RECORD_LEN]; + int type = 0; + + while (read_packet(&type, buffer, sizeof(buffer))) { + if (type == PID_SBN) { + track_add_wpt(track, decode_sbn_record(buffer)); + } else if (type == PID_VISIBLE_LIST) { + /* A list of visible SVs, their IDs, azimuths, elevations. + * Not storing this info for now. */ + } else { + warning(MYNAME ": Format error: Unknown packet type 0x%02x.\n", type); + } + } +} + +/**********************************************************************/ + +static void +sbn_rd_init(const char *fname) +{ + file_handle = gbfopen(fname, "r", MYNAME); +} + +static void +sbn_rd_deinit(void) +{ + gbfclose(file_handle); +} + +static void +sbn_read(void) +{ + if (global_opts.masked_objective & TRKDATAMASK) { + route_head *track; + + track = route_head_alloc(); + track_add_head(track); + + read_sbn_header(track); + + add_logpoints(track); + } +} + +static void +sbn_exit(void) +{ +} + +/**********************************************************************/ + +ff_vecs_t sbn_vecs = { + ff_type_file, + { + ff_cap_none /* waypoints */, + ff_cap_read /* tracks */, + ff_cap_none /* routes */ + }, + sbn_rd_init, + NULL, + sbn_rd_deinit, + NULL, + sbn_read, + NULL, + sbn_exit, + sbn_args, + /* Characters are always encoded in ASCII. Even if the unit is set + * to Chinese language, only ASCII characters can be entered. */ + CET_CHARSET_ASCII, 0 +}; +/**********************************************************************/ diff --git a/sbp.c b/sbp.c index 5cac94d04..1ec70597a 100644 --- a/sbp.c +++ b/sbp.c @@ -49,77 +49,36 @@ sbp_rd_deinit(void) gbfclose(file_handle); } -#ifdef SBP_PARSE_HEADER -static size_t -hdrcpy(char *dest, const char *src, - size_t max_len, char delim) -{ - size_t i; - - for (i = 0; i < max_len && *src != delim; i++) - *dest++ = *src++; - *dest++ = 0; - - return ++i; -} -#endif - static void -decode_header(route_head *track) +read_sbp_header(route_head *track) { - char header[64]; - - if (gbfread(header, sizeof(header), 1, file_handle) == 1) { -#ifdef SBP_PARSE_HEADER - /* - * A complete SBP file contains 64 bytes header, - * - * Here is the definition of the SBP header - * BYTE 0 ~1 : true SBP header length - * BYTE 2~63: MID_FILE_ID(0xfd) with following payload : - * User Name, Serial Number, Log Rate, Firmware Version - * >field separator:"," - * >User Name : MAX CHAR(13) - * >Serial Number : MAX CHAR(8) - * >Log Rate : MAX CHAR 3, 0..255 in seconds - * >Firmware Version : MAX CHAR (13) - * // will stuff 0xff for remaining bytes - */ - -#define HDR_LEN 2 -#define PACKET_HDR_LEN 5 /* 0xa0 0xa2 len 0xfd */ -#define USERNAME_LEN 13 -#define SERIAL_NUM_LEN 9 -#define LOG_RATE_LEN 3 -#define VERSION_LEN 13 -#define SEP ',' -#define PAD 0xFF - - int hdr_len; - char username[USERNAME_LEN + 1]; - char serial_num[SERIAL_NUM_LEN + 1]; - char log_rate[LOG_RATE_LEN + 1]; - char version[VERSION_LEN + 1]; - char *p = header; - - hdr_len = le_read16(p); - p += HDR_LEN; - p += PACKET_HDR_LEN; - - p += hdrcpy(username, p, USERNAME_LEN, SEP); - p += hdrcpy(serial_num, p, SERIAL_NUM_LEN, SEP); - p += hdrcpy(log_rate, p, LOG_RATE_LEN, SEP); - p += hdrcpy(version, p, VERSION_LEN, PAD); - /* fixme: version includes checksum and end sequence bytes */ - - printf("Username: %s\n", username); - printf("Serial Number: %s\n", serial_num); - printf("Log rate (seconds): %s\n", log_rate); - printf("Firmware version: %s\n", version); -#endif /* SBP_PARSE_HEADER */ + /* + * A complete SBP file contains 64 bytes header, + * + * Here is the definition of the SBP header + * BYTE 0 ~1 : true SBP header length + * BYTE 2~63: MID_FILE_ID(0xfd) + * will stuff 0xff for remaining bytes + */ + +#define HEADER_SKIP 7 + + int success; + char header[64]; + + if (gbfread(header, sizeof(header), 1, file_handle) == 1) { + size_t len = le_read16(header) - HEADER_SKIP; + if (len > sizeof(header)) + len = sizeof(header); + + success = locosys_decode_file_id(header + HEADER_SKIP, len); } else { - fatal(MYNAME ": Couldn't read SBP header. " - "This probably isn't a SBP file.\n"); + success = FALSE; + } + + if (!success) { + fatal(MYNAME ": Format error: Couldn't read SBP header." + "This probably isn't a SBP file.\n"); } } @@ -145,7 +104,7 @@ sbp_read(void) track = route_head_alloc(); track_add_head(track); - decode_header(track); + read_sbp_header(track); while ((logpoint = read_logpoint())) { track_add_wpt(track, logpoint); diff --git a/testo b/testo index 400638746..d201d42b4 100755 --- a/testo +++ b/testo @@ -1314,6 +1314,12 @@ gpsbabel -t -i gpx -f ${TMPDIR}/navilink_tracks.gpx -o navilink -F ${TMPDIR}/nav gpsbabel -t -i sbp -f ${REFERENCE}/track/datalog.sbp -o gpx -F ${TMPDIR}/datalog.gpx compare ${TMPDIR}/datalog.gpx ${REFERENCE}/track/datalog.gpx +# +# SBN tracks (Locosys NaviGPS) +# +gpsbabel -t -i sbn -f ${REFERENCE}/track/sbn.SBN -o gpx -F ${TMPDIR}/sbn.gpx +compare ${TMPDIR}/sbn.gpx ${REFERENCE}/track/sbn.gpx + # # MTK logger tests # @@ -1506,7 +1512,7 @@ bincompare ${TMPDIR}/navitel_trk.bin ${TMPDIR}/navitel_trk2.bin # rm -f ${TMPDIR}/itracku.unicsv gpsbabel -w -i itracku-bin -f ${REFERENCE}/itracku.dat -o unicsv -F ${TMPDIR}/itracku.unicsv -echo FIXME: Skipping itracku for TZ problem. +echo FIXME: Skipping itracku for TZ problem. Continuing. # compare ${REFERENCE}/itracku.unicsv ${TMPDIR}/itracku.unicsv # diff --git a/util.c b/util.c index 92fd7247f..8bd327487 100644 --- a/util.c +++ b/util.c @@ -689,6 +689,13 @@ be_read16(const void *p) return i[0] << 8 | i[1]; } +unsigned int +be_readu16(const void *p) +{ + const unsigned char *i = (unsigned char *) p; + return i[0] << 8 | i[1]; +} + void be_write16(void *addr, const unsigned value) { diff --git a/vecs.c b/vecs.c index 9f9ae3311..9da58ece7 100644 --- a/vecs.c +++ b/vecs.c @@ -153,6 +153,7 @@ extern ff_vecs_t jtr_vecs; extern ff_vecs_t itracku_vecs; extern ff_vecs_t itracku_fvecs; extern ff_vecs_t sbp_vecs; +extern ff_vecs_t sbn_vecs; extern ff_vecs_t mmo_vecs; extern ff_vecs_t skyforce_vecs; @@ -879,6 +880,12 @@ vecs_t vec_list[] = { "NaviGPS GT-31/BGT-31 datalogger (.sbp)", "sbp" }, + { + &sbn_vecs, + "sbn", + "NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn)", + "sbn" + }, { &mmo_vecs, "mmo", diff --git a/xmldoc/formats/sbn.xml b/xmldoc/formats/sbn.xml new file mode 100644 index 000000000..18d22215c --- /dev/null +++ b/xmldoc/formats/sbn.xml @@ -0,0 +1,30 @@ + + This format is for SBN datalog files saved to the SD card by + the Locosys GT-11/BGT-11/GT-31/BGT-31. + + + On the device, logging in this format is enabled by choosing + SBN from the NMEA ITEMS menu on the MEMORY CARD screen. + + + Not all data logged in this format is converted by GPSBabel, + but the following are: + + + Position + Elevation + Time + Fix type (2D/3D/DGPS) + Speed + Course + Number of satellites visible + Horizontal Dilution of Precision (HDOP) + + + + + The specification of this format can be found in + the + SiRF Binary Protocol Reference Manual, in the section + called Geodetic Navigation Data - Message ID 41. + -- 2.30.2